概述
只有bx,si,di,bp可以在[ ]进行内存单元寻址,只能有4种组合
[bx+si],[bx+di],[bp+si],[bp+di]
bx没有显示指定段地址默认在ds中 例子:mov ax,[bx+si]=(ax)=(ds*16+bx+si)
bp没有显示指定段地址默认在ss中 例子:mov ax,[bp+si]=(ax)=(ss*16+bx+si)
指定指令处理数据长度:
1寄存器指定:mov ax,1 ax是16位寄存器,指定数据长度为16位,2个字节,一个字
mov al,1 al是8位寄存器,指定数据长度为8位,1个字节
2显示指定: X ptr mov byte ptr, ds:[0],1 指定数据长度为一个字节,ds:[0]=01
mov wort ptr ds:[0] ,1 指定数据长度为一个字,2个字节 ds:[0]=01 ds:[1]=00
内存偏移地址组合灵活性可以应用于二维数组,结构体等数据结构
二维数组:[bx+idata]
结构体:[bx].idata[si]=[bx+idata+si],bx定位结构体,idata定位数据项,si定位数据项的每一个元素
div除法指令:
1除数有8位和16位两种,放在内存单元或者寄存器中
2被除数:默认在AX(16位)或DX+AX(32位)中,如果除数是8位,被除数就是16位,默认存放在AX中,如果除数是16位,被除数就是32位,在DX+AX中存放,DX存放高位,AX存放低位
3结果:除数是8位,商在AL中,余数在AH中
除数是16位,商在AX中,余数在DX中
例子:
div byte ptr ,ds:[0] 含义: (al)=(ax)/(ds*16+0) 商在al中 (ah)=(ax)/(ds*16+0) 余数在ah
div word ptr ,es:[0] 含义: (ax)=((dx)*10000H+(ax))/(es*16+0)商在aX中 (dx)=((dx)*10000H+(ax))/(es*16+0) 余数在dx中
假如一个程序:100001/100
assume cs:code
code segment
start: mov dx,1
mov ax,86A1H ;(dx)*10000H+(ax)=100001
mov bx,100
div bx
mov ax,4c00h
int 21h
code ends
end start
被除数大于65535,大于16位,用dx和ax存放,除数100小于255,8位寄存器可以存放,但是被除数是32位, 所以除数要用16位寄存器存放
mul指令:乘法指令
两个相乘的数:要么都是8位,要么都是16位,如果是8位,一个默认在al中,另一个放在8位寄存器或内存字节单元中,如果是16位,一个默认在AX中,另一个放在16位寄存器或内存字单元中
相乘的结果:8位相乘,结果放在AX中,16位相乘,结果放在DX和AX中,高位放在DX,低位放在AX
指令格式:mul reg(寄存器) mul 内存单元
例子:计算100*1000 100可以用8位存,1000要用16位存,所以要用16位相乘
mov ax,100
mov bx,1000
mul bx
最后
以上就是爱笑水池为你收集整理的寄存器在内存单元寻址组合和div/mul指令笔记的全部内容,希望文章能够帮你解决寄存器在内存单元寻址组合和div/mul指令笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复