• 《汇编语言》第五章-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
    
    本文由作者原创,如需转载注明出处!
  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/Fsiswo/p/11165468.html
Copyright © 2020-2023  润新知