Gcc-asm 使用指南
一.简介
linux 下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序
全部用汇编语言编写。尽管是完全的汇编代码,linux 平台下的汇编工具也吸收了 C 语言的长处,使得
程序员可以使用 #include、#ifdef 等预处理指令,并能够通过宏定义来简化代码。第二种是内
嵌的汇编代码,指的是可以嵌入到 c 语言程序中的汇编代码片段。虽然 ansi-c 语言标准中没有关于
内嵌汇编代码的相应规定,但各种实际使用的 c 编译器都做了这方面的扩充,这其中当然就包括
linux 平台下的 gcc。
二、linux 汇编语法格式
绝大多数 linux 程序员以前只接触过 intel 风格的汇编代码。但在 unix 和 linux 系统中,更
多采用的还是 at&t 格式,两者在语法格式上有着很大的不同:
1.在 at&t 汇编格式中,寄存器名要加上'%'作为前缀;而在 intel 汇编格式中,寄存器名不需
要加前缀。例如:
at&t 格式 intel 格式
pushl %eax push eax
2. 在 at&t 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 intel 汇编格式中,立即
数的表示不用带任何前缀。例如:
at&t 格式 intel 格式
pushl $1 push 1
3.at&t 和 intel 格式中的源操作数和目标操作数的位置正好相反。在 intel 汇编格式中,
目标操作数在源操作数的左边;而在 at&t 汇编格式中,目标操作数在源操作数的右边。例如:
at&t 格式 intel 格式
addl $1, %eax add eax, 1
4. 在 at&t 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分
别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32 比特);
而在 intel 汇编格式中,操作数的字长是用 "byte ptr" 和 "word ptr" 等前缀来
表示的。例如:
at&t 格式 intel 格式
movb val, %al mov al, byte ptr val
5. 在 at&t 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,
而在 intel 格式中则不需要。
6. 远程转移指令和远程子调用指令的操作码,在 at&t 汇编格式中为 "ljump" 和
"lcall" ,而在 intel 汇编格式中则为 "jmp far" 和 "call far",即:
at&t 格式 intel 格式
ljump $section,
$offset
jmp far
section:offset
lcall $section,
$offset
call far
section:offset
评论0