|
发表于 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格式)
其余的部分我就不打了,我得走了:) |
|