SunnyOS准备1

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!!!

引用:

http://blog.csdn.net/21cnbao/article/details/7385161

http://blog.csdn.net/happy987818/article/details/51557502

原文地址:https://www.cnblogs.com/chaunceyctx/p/7302417.html