汇编Day3

先解决一个常量问题。比较如下汇编指令:

mov al,[0] 含义:(al)=0,将常量0送入al中(与mov al,0)含义相同

mov al,ds:[0] 含义:(al)=((ds)*16+0) 将内存单元中的数据送入al中

mov al,[bx] 含义:(al)=((ds)*16+(bx)) 将内存单元中的数据送入al中

mov al,ds:[bx] 含义:同上

loop和[bx]的联合应用

考虑这样一个问题,计算ffff:0-ffff:b单元的数据的和,结果存储在dx中。

首先分析,运算结果是否会超出dx所能存储的范围?ffff:0-ffff:b中的数据是字节型数据,范围在0-255之间,12个这样的数据相加结果不会大于65535,可以在dx中存下。

能否将数据直接累加到dx中?不能,8位数据不能直接累加到16位寄存器dx中。

能否将数据累加到dl中,并设置(dh)=0,从而实现累加的目标?不能,低位相加有进位,这样会丢失进位。

综合上述问题,目前的解决方法是将8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。

通过loop指令优化后的完整代码:

assume cs:code

code segment

        mov ax,0ffffh

        mov ds,ax

        mov bx,0

        mov dx,0

        mov cx,12

s:     mov al,[bx]

        mov ah,0

        add dx,ax

        inc bx   //实现(bx)=(bx)+1

        loop s

        mov ax,4c00h

        int 21h

code ends

end

段前缀:如指令 mov ax,ds:[bx]        mov ax,cs;[bx]        mov ax,ss:[0] 中的ds,cs,ss用于显示地指明内存单元地段地址在汇编语言中叫做段前缀。                  

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值