类型:笔记
参考书:《汇编语言》- 第三版
编写人:王爽
第五章-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