zoukankan      html  css  js  c++  java
  • 《汇编语言》第五章-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
    
    本文由作者原创,如需转载注明出处!
  • 相关阅读:
    linux下的进程管理
    linux 下的rpm包管理
    计算机基础之OSI模型 & TCP协议簇
    计算机网络基础-IP分类及划分子网实例
    docker容器可被其他主机访问设置
    redis连接问题
    redis五大类型常用命令-string|list|hash|set|zset-订阅-事务
    docker login & push失败问题记录
    linux下 python 和 pip 安装换源及虚拟环境管理详解
    linux 查看系统版本号
  • 原文地址:https://www.cnblogs.com/Fsiswo/p/11165468.html
Copyright © 2011-2022 走看看