汇编3

寻址

bx(基址寄存器)bp(基址指针)si(源变址寄存器)di(目的变址寄存器)
enter description here

使用

以下

1
2
3
4
5
6
7
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]

mov ax,[bx+bp]
mov ax,[si+di]

全错:(
其它寄存器不能用于寻址,不能基址+基址或变址+变址

注意bp

bp默认段寄存器为ss(栈段),且bp+ 的段寄存器也为ss


可单独使用

1
2
3
4
mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]

可基址搭配变址

1
2
3
4
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]

加上立即数(idata)等等,详细分类以下

可见

enter description here

ptr

byte ptr或word ptr指明内存单元长度

1
2
mov word ptr ds:[0],1
inc byte ptr [bx];否则是将由地址bx和地址bx+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
2
jmp short s
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
2
(cx)--;
if((cx)!=0)jmp short 标号;

NOP

啥也不是,填充

OFFSET

1
2
mov di,offect s
s: ...

取标号地址


使用到栈时,单步debug(t)会覆盖栈ss,而(g)的结果正确
涉及单步debug时的中断原理

---------------THEEND---------------