回 帖 发 新 帖 刷新版面

主题:问一个很基础的问题

假如有100个16位无符号数存放从1234:5678h开始的内存中,现需要要求他们的和,设把32位的和保存在dx(高位)和ax寄存器中。


书上给出了这一段汇编代码,我有些地方不明白,所以想问问
     mov ax,1234h
     mov ds,ax
     mov si,5678h
     mov ax,0      ;这里为什么要把ax置0?
     mov dx,ax   ;这里为什么又要把ax传给dx???
     mov cx,100
next:add ax,[si]   ;ax不是0吗?这里是求100个内存单元的和?
     adc,dx,0    ;那这里为什么又要把0给dx?
     inc si     ;下面为什么要用两次inc???
     inc si
     dec cx
     jnz next

回复列表 (共5个回复)

沙发

haha,超可爱的问题
1.ax置0,也就是清零,目的用于放将来的数据,题目设把32位的和保存在dx(高位)和ax寄存器中。所以,dx同样要被置零。如果ax和dx的数据不为零,则求和的时候会加上ax和dx的数据,所以必须置零。
2.add ax,【si】;这条汇编指令是把ax的内容于si指向的5678h的内容相加,结果送回ax。如果ax不为零,则会把ax的内容加进来,造成求和出错。
3.adc dx,0;这条指令其实并不是加零,她主要是将进位位cf的内容加到dx。即:如果ax相加的内容有进位——超出16位,就把进位放到dx中。这样就可以表示16位到32位的数据。
4.在内存读取操作中,+1代表在字节单元增量,+2则代表字单元增量。楼主的题目是16位无符号数,所以她们每个数占一个字单位。只有+2才能正确跳转到下一个数。

楼主给+30分啊,我也只能从这种入门级的问题上搂点分咯。。。痛苦挣扎中。。。

板凳

o o o o o o

3 楼


[em2]呵呵
有意思哦
不懂可以交流
2个INC也可以写ADD SI,2
这样看来好多了

4 楼


"字"
当然要加两次

5 楼

5678是不是应该改为[5678]

我来回复

您尚未登录,请登录后再回复。点此登录或注册