汇编语言07——数据处理的两个基本问题

整理自fishcc论坛

数据处理的两个基本问题


两个基本问题:

处理的数据放在什么地方
要处理的数据有多长


定义描述性符号:
reg 寄存器
sreg 段寄存器


目前已经学过的reg的集合:
ax,bx,cx,dx,sp,dp,si,di
sreg的集合:
ds,ss,cs,es


开始解决问题1:处理的数据放在什么地方
在8086CPU中,只有四个寄存器(bx,bp,si,di)可以用在[...]中进行内存寻址
并且,这四个寄存器只能以四种组合出现:
bx & si
bx & di
bp & si
bp & di


比如,错误的用法:[bx + bp]


只要在[...]中使用bp,且没有显式指定段地址,段地址默认在ss中
比如:
mov ax,[bp + si + idata]
含义:(ax) = ((ss) * 16 + (bp) + (si) + idata)
(bp可以减轻sp的负担...)


汇编语言中用三个概念来表示数据的位置
1,立即数(idata) mov ax,1
2,寄存器 mov ax,bx
3,段地址(sa)和偏移地址(ea) mov ax,[bx + si + 8]
mov ax,es:[bx]

下面处理第二个问题:要处理的数据有多长
方法1:通过寄存器指明:例如 mov ax,1
mov al,1
方法2:用word ptr指明要访问内存单元是一个字单元
mov word ptr ds:[0],1
inc word ptr [bx]
用byte ptr显性指明要访问的内存是一个字节单元


补充:push指令只进行字操作


div指令:
div是除法指令
要求:除数为8位或者16位
被除数(默认)放在ax或(ax和dx)中

当除数为8位时,要求被除数为16位(ax)
当除数为16位时,要求被除数为32位(dx + ax)

当结果为8位,商存在al中,余数在ah中
当结果为16位,商存在ax中,余数在dx中

div指令的格式
div reg
div 内存单元
例如: div byte ptr ds:[0]
含义:(al) = (ax) / ((ds) * 16 + 0)的商
(ah) = (ax) / ((ds) * 16 + 0)的余数


div word ptr [bx + si + 8]
含义:(ax) = (dx * 10000H + (ax))/(ds * 16 + bx + si + 8)的商
(dx) = (dx * 10000H + (ax))/(ds * 16 + bx + si + 8)的余数

例:
计算100001/100
100001十六进制对应186A1H
程序如下:
mov dx,1
mov ax,86A1
mov bx,100
div bx


伪指令dd
db定义字节型数据
dw定义字型数据
dd定义dword(双字,32位)

操作符dup
与db,dw,dd配合使用,用来进行数据的重复
例如:db 3 dup (0) 定义了3个字节,都是0
等价于db 0,0,0
db 3 dup (1,2,3)
等价于1,2,3,1,2,3,1,2,3


dup使用格式:
db 重复次数 重复内容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章