《汇编语言》第五章-5.5-loop和[BX]联合应用疑问与解决

类型:笔记
参考书:《汇编语言》- 第三版
编写人:王爽

第五章-5.5-loop和[BX]联合应用

问题:计算ffff:0~ffff:b单元数据的和,结果存储在dx中。

原文省略,意思就是 ffff:0~ffff:b 内存单元的数据是字节型数据,范围在0~255之间,12个这样的数相加,结果不会大于65535,可以在dx中放下。

问题在于,如果直接在dx作累加,肯定是不行的?原文在这里一笔带过,接着给出用中间变量的方法而不说缘由。我有了疑惑?why?一顿分析后有了结果。

  • 少数量的位结构不能直接向多数量的位结构进行操作。
    比如dx为16位的解构,8位的数据传进来是给高8位还是低8位。

  • 少数量的位结构如何向多数量的位结构进行操作
    比如ax为16位结构,确定高8位,使得 ah = 0 ,然后把8位内存单元的数据移动到 al。ax依旧是16位结构,而8位数据也传进来了。当然也可以确定低8位,数据传到高8位。延伸猜想:在没有语言或操作系统的人为硬性规定。少数量的位结构都可以使用此方法向高数量的位结构传送数据。

    • 高数量的位结构不能像低数量位结构传送数据。

有了上述了解,就能明白,为什么需要使用中间变量ax了。
dx的一次性加问题 转换为 内存单元的数据单次移动到ax,ax单次移动到dx的问题了

如果是第一种情况,假设 ffff:0内存单元的数据为255

执行一次

  s:add dl,dx
    mov dh,0
    loop s  

dl为8位,最大能表示255,而dh必须为0,否则这个8位数就不能移动到16位数中。后面也必须保持为0。关键是ffff:1的数据为任何数都会导致dl中的数进位,在后面的数不断移动过程中,后果就无法预料了。

如果是第二种情况,假设 ffff:0内存单元的数据依旧为255

  s:add al,dx
    mov ah,0
    mov dx,ax
    loop s  

al中的数就算为最大数255,没关系,只要执行mov dx,ax这句指令,下次循环进来最大又可以表示255。一点都不虚。

还有一点疑惑就是:为什么中间变量不采用8位呢?因为在移动到dx,又会让CPU产生困惑,到底是高8位还是低8位呢

  • 完整代码
assume cs:code
code segment

    mov ax,ffffh
    mov ds,ax       ; 设置ds = ffffh
    
    mov dx,0        ; 初始化累加器为0 
    mov cx,0bh      ; 设定计数器,汇编不支持字母在首
    
    mov bx,0        ; 变量,用于偏移地址变换
  s:mov al,[bx] 
    mov ah,0
    add dx,ax       
    inc bx
    loop s          ; 以上为循环

    mov ax,4c00h    
    int 21h          

code ends
end
posted @ 2019-07-10 17:46  Chanmoo  阅读(226)  评论(0编辑  收藏  举报