Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2092827
  • 博文数量: 413
  • 博客积分: 10926
  • 博客等级: 上将
  • 技术积分: 3862
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 18:14
文章分类

全部博文(413)

文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(6)

2011年(138)

2010年(85)

2009年(42)

2008年(46)

2007年(26)

2006年(59)

分类: LINUX

2007-07-09 21:10:20

1, 用gdb调试汇编程序
    (1) 跟gcc一样,编译时,加上-g选项。
eg:
    nasm -f elf -g xxx.asm
    
    (2) 连接时,一定要去掉-s选项,因为-s 表示从输出文件中去掉所有的符号信息.
eg:
    ld -o xxx xxx.asm

    (3) 用gdb调试。
eg:
    gdb xxx


2, 汇编中符号"$"表示当前地址。
eg
    array DD 100, 200, 500, 600
    number DD ($-array)/4   ;dimension of array

3, 在汇编中addtion(add, adc, inc)/subtraction(sub, sbc, dec)只需要一个时钟周期,而multiplication(mul, imul)/division(div, idiv)需要至少10个时钟周期。所以尽可能用addition/subtraction 代替 multiplication/division.
eg:
  1)    ;AX * 2
        add AX, AX

  2)    ;AX * 10
        mov AX, y   ;AX = y
        add AX, AX  ;AX = 2*y
        mov BX, AX  ;BX = 2*y
        add AX, AX  ;AX = 4*y
        add AX, AX  ;AX = 8*y
        add AX, BX  ;AX = 10*y
        add AX, AX

4, 无符号数和带符号数的条件跳转有些不同:
               无符号数                带符号数
大于      ja(Jump on Above)     jg(Jump on Greater)
小于      jb(Jump on Below)     jl(Jump on Less)

5, 跳转
无条件跳转(jmp)可以是short型(当前EIP与目标地址之间的相对距离displacement在-128~127之间,即一个signed 8-bit数的表示范围内), 也可以是near型(当前EIP与目标地址之间的相对距离在-128~127之外,需要用一个signed 16-bit或signed 32-bit数表示)。
条件跳转(je, jz, jc 等)只能是short型的。所以,如果在条件跳转语句中, 相对距离displacement在-128~127之外,需要借助于无条件转移实现。
eg:
       ......
    target:
       ......
       cmp EAX, EAX
       je target   ;假设相对距离太大而不能用je,
       mov EXC, 10

修改如下:
       ......
    target:
       ......
       cmp EAX, EAX
       jne skip    ;修改条件为jne;且增加一个label,使条件跳转相对距离在-128~127之间
       jmp target  ;near型无条件跳转
    skip:
       mov EXC, 10
阅读(1956) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~