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