寻址
bx(基址寄存器)bp(基址指针)si(源变址寄存器)di(目的变址寄存器)
使用
以下
1 | mov ax,[cx] |
全错:(
其它寄存器不能用于寻址,不能基址+基址或变址+变址
注意bp
bp默认段寄存器为ss(栈段),且bp+ 的段寄存器也为ss
可单独使用
1 | mov ax,[bx] |
可基址搭配变址
1 | mov ax,[bx+si] |
加上立即数(idata)等等,详细分类以下
可见
ptr
byte ptr或word ptr指明内存单元长度
1 | mov word ptr ds:[0],1 |
push、pop一定针对字型(16)
div
其中
除数:8位和16位两种
被除数:默认放在 ax 或 dx和ax 中(dx存放高16位,ax存放低16位)
如果除数为8位,则ax中al存储商ah存储余数;如果除数为16位,则ax存储商dx存储余数
1 | div byte ptr ds:[0] |
即: (al)=(ax)/((ds)*16+0) 之商
(ah)=(ax)/((ds)*16+0) 之余
1 | div word ptr ds:[0] |
即: (ax)=[(dx)*10000h+(ax)]/((ds)*16+0) 之商
(dx)=[(dx)*10000h+(ax)]/((ds)*16+0) 之余
转移指令
即修改cs、ip的指令
段内转移:只修改ip,比如jmp ax
段间转移:同时修改cs:ip,比如jmp 1000:0
短转移:IP的修改范围为-128字节~127字节(2的8次方,8位)
近转移:IP的修改范围为-32768字节~32767字节(2的16次方,16位)
JMP标号转移
jmp short s
转到标号处执行命令
段内短转移
范围-128~127
1 | jmp short s |
jmp near ptr s
转到标号处执行命令
段内近转移
范围-32768~32767
jmp far ptr s
转到标号处执行命令
段间转移,同时修改CS和IP
JMP地址转移
jmp [16位寄存器]
jmp word ptr 段寄存器:[偏移]
段内转移
从内存单元地址出开始存放着一个字,是转移的目的偏移地址,改变IP
jmp dword ptr 段寄存器:[偏移]
段间转移
从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址,同时改变CS、IP
JCXZ条件转移
短转移
1 | if((cx)==0) jmp short 标号; |
这么个意思
LOOP
循环,本质也是转移指令
1 | (cx)--; |
NOP
啥也不是,填充
OFFSET
1 | mov di,offect s |
取标号地址
使用到栈时,单步debug(t)会覆盖栈ss,而(g)的结果正确
涉及单步debug时的中断原理