call的原理

先将call后面的一行代码的偏移地址压入堆栈,然后jmp,遇到ret后,pop 堆栈进入ip(32位弹如eip),从而使程序知道跳入哪段代码,从而jmp到后面的代码

注意引用dw类型数组时的下标

1
2
3
4
5
6
data segment
abc db 1,2,3,4
xyz dw 789Ah, 0BCDEh
asd dd 12345678h, 56789ABCh; 首元素为asd[0]
; 末元素为asd[4]
data ends

在引用xyz中第二个元素时要注意下标

1
2
mov ax, xyz[2] ;\编译后变成:
mov ax, [xyz+2];/mov ax, ds:[6]

mov指令不影响任何标志位

FL和IP寄存器在编程时不能直接引用

div运算相关

商默认放在al中,余数默认放在ah中,也就是说在除法运算中,被除数会被损坏

堆栈入栈和出栈时的动作先后顺序

入栈

先sp减小2,再把push后面的数值保存到ss:sp指示的地方

出栈

先取出ss:sp中内容,再sp加2恢复

关于堆栈

注意入栈sp是减而不是加!

注意push和pop只能对16位字和32位双字操作,不能对8位字节进行操作

两组段地址应用

cs:ip 指向当前要执行的命令

ss:sp 指向堆栈顶端

32位汇编相关

  • 32位汇编中,[]中有ebp和esp时,段地址为ss,否则段地址为ds
  • 32位比16位多了以下这种寻址方式:[寄存器+寄存器*n+常数](其中n=2、4、8)
  • 32位汇编对[]中寄存器不做限制,但是段寄存器,ip寄存器,fl寄存器不能放在方括号中
  • 32位汇编起允许push一个常数

参数传递时的堆栈传递