鱼C论坛

 找回密码
 立即注册
查看: 3369|回复: 3

对第七章问题7.2的质疑

[复制链接]
发表于 2011-6-19 17:05:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 开机中。。。 于 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,[si]
mov [di],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位寄存器‘在这里貌似不适用了,还是我根据代码理解错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-19 18:08:15 | 显示全部楼层
呵呵 你并没有把 di 和 si分别分为两个8位寄存器
至于为什么循环 八次 就可以了            
你想想:你在数据段定义字符串时  是用db定义的 所以 就是一个字母一个“字节”而不是“字”
而你在循环里  是:
mov ax,[si]
mov [di],ax
add si,2                        
add di,2
那么也就是说你一次性把两个字母进行了复制 也 就是说你一次性把一个“字”的数据复制到了后面所以只要复制八次  
而原本如果按照一个字节一个字节复制当然是要十六次!
希望这样说你能看懂!呵呵呵呵…………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-19 18:30:01 | 显示全部楼层
2字节 = 1字 即 2Byte = 1word
ax = 16位寄存器 所以一次可以传输2字节 01 00
ax= 0001 高8位寄存器AH =00 低8位寄存器al =01
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 15:48:13 | 显示全部楼层
OK,这个解释可以听懂,谢谢楼上2位朋友的耐心解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 22:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表