fishcrazy 发表于 2003-1-25 00:00:06

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

这几天因为两个汇编文件,还有其他文件对它们的调用,让我头痛不已……

dalin 发表于 2003-1-25 12:32:52

找套情景分析先看看吧。

fishcrazy 发表于 2003-1-26 04:46:30

可以提供一些线索吗?

dalin 发表于 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”来表示。
如:

MOV AL,BYTE PTR FOO                         (Intel格式)
movb FOO,%al                  (AT&T格式)

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”.当转移和调用的目标为直接操作数时,两种不同 的表示如下:

CALL FAR SECTION:OFFSET
JMP FAR SECTION:OFFSET                     (Intel格式)

lcall $section,$offset
ljmp $section,$offset                              (AT&T格式)

与之相就的远程返回指令,则为:
RET FAT STACK_ADJUST       (Intel格式)
lret $ stack_adjust             (AT&T格式)
8、间接寻址的一般格式,两者区别如下:
SECTION:       (Intel格式)
section:disp(base,index,scale)             (AT&T格式)


其余的部分我就不打了,我得走了:)
页: [1]
查看完整版本: 关于内核代码里的汇编代码,斑竹有什么好建议吗?