开机中。。。 发表于 2011-6-19 17:05:18

对第七章问题7.2的质疑

本帖最后由 开机中。。。 于 2011-6-20 15:49 编辑

assume cs:codesg,ds:datasg

datasg segment

db 'welcome to masm!'
db '................'

datasg ends

codesg segment

start:mov ax,datasg
mov ds,ax
mov si,0
mov di,16

mov cx,8                        'mov cx,16

s: mov ax,
mov ,ax
add si,2                           'inc si
add di,2                        'inc di
loop s

mov ax,4c00h
int 21h

codesg ends

end start
书上写的很清楚si与di不能分为2个8位寄存器,所以原程序把 cx设置为8,但是大家注意代码中红色的代码,如果执行后,结果一样是正确的,何解? 不要告诉我多循环了8次,我要的答案是为什么’书上写的很清楚si与di不能分为2个8位寄存器‘在这里貌似不适用了,还是我根据代码理解错了?

Y.H 发表于 2011-6-19 18:08:15

呵呵 你并没有把 di 和 si分别分为两个8位寄存器
至于为什么循环 八次 就可以了            
你想想:你在数据段定义字符串时是用db定义的 所以 就是一个字母一个“字节”而不是“字”
而你在循环里是:
mov ax,
mov ,ax
add si,2                        
add di,2
那么也就是说你一次性把两个字母进行了复制 也 就是说你一次性把一个“字”的数据复制到了后面所以只要复制八次
而原本如果按照一个字节一个字节复制当然是要十六次!
希望这样说你能看懂!呵呵呵呵…………

Miller01001 发表于 2011-6-19 18:30:01

2字节 = 1字 即 2Byte = 1word
ax = 16位寄存器 所以一次可以传输2字节 01 00
ax= 0001 高8位寄存器AH =00 低8位寄存器al =01

开机中。。。 发表于 2011-6-20 15:48:13

OK,这个解释可以听懂,谢谢楼上2位朋友的耐心解答
页: [1]
查看完整版本: 对第七章问题7.2的质疑