汇编语言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 重复次数 重复内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值