AT&T语法汇编和Intel语法汇编比较:
1. 前缀:
①在AT&T语法中,寄存器以'%'为前缀,立即数则以'$'为前缀,而Intel语法中则没有;
②在Intel语法中,十六进制立即数以'h'结尾,二进制立即数则以'b'结尾。另外对于编译器来说,十六进制立即数不能以字符a~f打头,需要在前面上加上'0'。而AT&T语法中,十六进制使用 " 0x数据 "来表示
Intel Syntax | AT&T Syntax |
mov eax, 1 | movl $1, %eax |
mov ebx, 0ffh | movl $0xff, %ebx |
int 80h | int $0x80 |
2. 运算方向:
在运算方向上,Intel语法与AT&T语法正好相反。 在Intel语法中,第一个是目标操作数,第二个是源操作数,而在AT&T语法中,第一个是源操作数,第二个是目标操作数。
3.内存运算:
Intel语法格式是 segreg:[base + index * scale + disp],
AT&T语法格式则是%segreg:disp(base, index, scale)。
AT&T语法 |
Intel语法 |
movl -4(%ebp), %eax |
mov eax, [ebp - 4] |
movl array(, %eax, 4), %eax |
mov eax, [eax*4 + array] |
movw array(%ebx, %eax, 4), %cx |
mov cx, [ebx + 4*eax + array] |
movb $4, %fs:(%eax) |
mov fs:eax, 4 |
在Intel语法中,内存单元用方括号表达,而在AT&T语法中,它是由圆括号括起来的。
4. 后缀:
后缀表示的是操作数的大小:
AT&T语法中'l'代表long(32bit), 'w'代表word(16bit)和'b'代表byte(1字节);Intel语法使用byte ptr, word ptr, dword ptr
AT&T中指令:
movb 传送字节
movw 传送字
movl 传送双字
5. 跳转指令;
AT&T 格式:ljump $section, $offset
Intel 格式: jmp far section:offset
AT&T 格式:lcall $section, $offset
Intel 格式:call far section:offset
直接跳转:即跳转目标是作为指令的一部分编码的(有可能是相对位移地址).
例如: jmp Label_1
间接跳转:即跳转目标是从寄存器或存储器位置中读出的. 写法是在" * "后面跟一个操作数指示符.
例如: jmp *%eax 用寄存器%eax中的值作为跳转目标
jmp *(%eax) 以%eax中的值作为读入的地址, 从存储器中读出跳转目标
gdb调试命令:
1.list(简写:l)命令:
①list <linenum>:显示程序第linenum行周围源程序
②list <function>:显示函数名为function函数的源程序
- list,显示当前行后面的源程序
- list - ,显示当前行前面的源程序
2.run(简写:r)命令:
运行程序
3.break(简写:b)命令:
①break <linenum>:在第linenum行处设置断点
②break <function>:在函数名处设置断点
③break +offset/-offset :在当前行的前/后offset行处设置断点
④break filename:linenum/filename:function:在某文件下的第linenum行/某文件下的function处设置断点
⑤break *address :在内存address处设置断点
⑥break:在下一行设置断点
⑦break...if <condition>:
对于循环体,break if i=100 当i = 100时停下程序
4.单步执行:
①next <count>:从当前行号开始执行count条代码,count可以不写表示一条条执行
②step <count>:与next相似,但是next是不进入函数执行,而step会进入
③nexti:表示执行一条条机器指令(一句代码可能由很多条机器指令组成)
④stepi:与nexti相似,但是是进入函数执行
5.continue(简写:c)指令:
①continue [ignore-count]
②fg [ignore-count]
都表示忽略ignore-count个断点
6.print(简写:p)命令:
①print <expr>
②print /输出格式 <expr>
输出格式选项:
- x 按十六进制格式显示变量。
- d 按十进制格式显示变量。
- u 按十六进制格式显示无符号整型。
- o 按八进制格式显示变量。
- t 按二进制格式显示变量。
- a 按十六进制格式显示变量。
- c 按字符格式显示变量。
- f 按浮点数格式显示变量。
7.watch命令:
①watch <expr>:在expr设置观察点,一旦expr改变就暂停程序
8.examine(简写:x)命令:
①x /<n/f/u> <addr>:查看addr内存地址内容
9.disassemble命令:
①disassemble <fucntion> 查看函数function的汇编代码
10.jump指令:
①jump <linenum>
②jump <address>
Done!!!
引用: