关于内核代码里的汇编代码,斑竹有什么好建议吗?
这几天因为两个汇编文件,还有其他文件对它们的调用,让我头痛不已…… 找套情景分析先看看吧。 可以提供一些线索吗? 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]