QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2059|回复: 3

关于内核代码里的汇编代码,斑竹有什么好建议吗?

[复制链接]
发表于 2003-1-25 00:00:06 | 显示全部楼层 |阅读模式
这几天因为两个汇编文件,还有其他文件对它们的调用,让我头痛不已……
发表于 2003-1-25 12:32:52 | 显示全部楼层
找套情景分析先看看吧。
回复

使用道具 举报

 楼主| 发表于 2003-1-26 04:46:30 | 显示全部楼层
可以提供一些线索吗?
回复

使用道具 举报

发表于 2003-1-26 10:37:48 | 显示全部楼层
GNU的386汇编跟intel汇编的区别:
1、在Intel格式中大多使用大写字母,在AT&T格式是都使用小写字母。
2、在AT&T格式中,寄存器名要加上“%”作为前缀,intel格式则不用
3、在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反。在intel格式中是目标在前,源在后,而在AT&T格式中则是源在前目标在后。例如,将寄存器eax的内容送入ebx,在intel格式中为“MOVE EBX,EAX”,而在AT&T格式中为“move %eax,%ebx”。
4、在AT&T格式中,访问指令的大小(宽度)由操作码的最后一个字母(也就是操作码的后缀)来决定。用操作码后缀的字母有b(表示8位),w(表示16位)和l(表示32位)。而在intel格式中,则是表示内存单元的操作数前面加上“BYTE PTR”,“WORD PTR”或“DWORD PTR”来表示。
如:
[code:1]
MOV AL,BYTE PTR FOO                         (Intel格式)
movb FOO,%al                  (AT&T格式)
[/code:1]
5、在AT&T格式中,直接操作数要加上“$”作为前缀,而在intel格式中则不带前缀。所以,intel格式中的“PUSH 4”在AT&T格式中就为“push $4”。
6、在AT&T格式中,绝对转移或调用指令jump/call的操作数(也即转移或调用的目标地址),要加上“*”作为前缀,而在intel格式中则不带
7、远程的转移指令和子程序调用指令的操作码名称,在AT&T格式中为“ljmp”和“lcall”,而在intel格式中,则为“JMP FAR”的“CALL FAR”.当转移和调用的目标为直接操作数时,两种不同 的表示如下:
[code:1]
CALL FAR SECTION:OFFSET
JMP FAR SECTION:OFFSET                     (Intel格式)[/code:1]
[code:1]
lcall $section,$offset
ljmp $section,$offset                              (AT&T格式)
[/code:1]
与之相就的远程返回指令,则为:
RET FAT STACK_ADJUST       (Intel格式)
lret $ stack_adjust             (AT&T格式)
8、间接寻址的一般格式,两者区别如下:
SECTION:[BASE+INDEX*SCALE+DISP]       (Intel格式)
section:disp(base,index,scale)             (AT&T格式)


其余的部分我就不打了,我得走了:)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-3 12:51 , Processed in 0.086470 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表