楼上是南大的?景仰一下.我不知道这个老师的原题是什么样子的,但我觉得MOV AX,59ADD AX,27这两行代码就够了,也没有必要进行DAA可以试试下面的代码(masm5下汇编通过)data segmentdata ends
code segmentassume cs:code,ds:data
start:mov ax,datamov ds,axmov al,59add al,27mov dl,almov ah,2 int 21hmov ah,7 int 21hmov ah,4chint 21h
code endsend start汇编 连接运行后的输出结果是一个大写的字母V(ASCII=86=59+27)所以我上面说要是有把数字转换为ascii的宏或者过程,输出结果就更明白了.大家练习起来就很容易了.这也是大学里汇编教学不好的地方,总是纸上谈兵.
我认为老师的意思是输出的结果也应该是十进制,这是问题的关键。十进制数和十六进制数在内存中的表示是不同的。比如,MOV AX,27 ;AX中存的是1BH,也就是00011011。而 MOV AX,27H;AX中存的是27H,也就是00100111。要想加法得出组合的十进制数,一定要用MOV AX,27H才行。我也说不大清楚了。
DAA
执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中. 不过我不太明白是什么意思.嘿嘿
在计算机中,ADD等指令对BCD码做运算也是用的与十六进制相同的进位方式,即满十六进一。可是BCD码表示的十进制数却应该是满十进一。因此,可以这样说,ADD对BCD码运算时,该进位的时候却没有进位,必然带来错误的结果。DAA就是用来校正这个结果的,使结果成为一个正确的BCD码。