zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    centos7安装doxygen
    mysql和mariadb支持insert delayed的问题
    Ubuntu用android-ndk-r15c编译boost_1_65_1
    记不住的Android活动的生命周期
    SpringBoot——经典的Hello World【二】
    SpringBoot——报错总结
    SpringBoot——SpringBoot学习记录【一】
    Nginx——配置文件服务下载
    CRAP-API——如何在Linux服务器部署CRAP-API教程
    Linux—— 报错汇总
  • 原文地址:https://www.cnblogs.com/chaunceyctx/p/7302417.html
Copyright © 2011-2022 走看看