注册 登录
编程论坛 汇编论坛

大家看看我们编的汇编语言为什么不对啊?

仁者无敌 发布于 2006-05-03 19:45, 1139 次点击
题目是这样子的:编写程序实现将十进制数59与27相加.
我们系几乎所有的人都是这样写的:
MOV AX,59
ADD AX,27
而老师说不对,应该这样写:
MOV AX,59H
MOV BX,27H
ADD BX,AX
DAA
不知道为什么?请哪位高手解释一下啊
12 回复
#2
lj_8606032006-05-04 10:53
59H和27H是十进制数吗?!
#3
公子吕2006-05-04 19:28
什么学校啊 你们老师那么菜吗?或者他题目有其他要求?
其实汇编和其他的语言不一样的地方就是新手不能马上在电脑上看到自己代码运行的结果,
你找一找网上有没有 ASCII到数字转换 和 数字到ASCII转换 的过程(函数)或者宏 ,有了这两个过程
在机器上运行你自己的代码 ,你会发现汇编和C一样简单.
当然上面说的那两个宏你也可以自己实现,不会很难
#4
–★–2006-05-04 21:14
老师说的有道理,确实应该这样写:
MOV AX,59H
MOV BX,27H
ADD BX,AX
DAA 关键就在这一条10进制加法调整指令
请你在DEBUG上调试一下(去掉后缀H)就会明白
#5
公子吕2006-05-04 21:43

楼上是南大的?景仰一下.

我不知道这个老师的原题是什么样子的,但我觉得
MOV AX,59
ADD AX,27
这两行代码就够了,也没有必要进行DAA
可以试试下面的代码(masm5下汇编通过)
data segment
data ends

code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax
mov al,59
add al,27
mov dl,al
mov ah,2
int 21h
mov ah,7
int 21h
mov ah,4ch
int 21h

code ends
end start

汇编 连接运行后的输出结果是一个大写的字母V(ASCII=86=59+27)所以我上面说要是有把数字转换
为ascii的宏或者过程,输出结果就更明白了.大家练习起来就很容易了.这也是大学里汇编教学不好的
地方,总是纸上谈兵.

#6
仁者无敌2006-05-06 11:59
四楼兄弟,给大家解释一下嘛
#7
公子吕2006-05-06 12:43
四楼的兄弟是说把两个16进制数相加,然后用DAA转换成BCD (看起来就是十进制)
你们老师既然说求两个十进制数的和,为什么还要把它弄成16进制相加再DAA转换呢
可能你老师说的题目不是你说的那样.
#8
汪洋2006-05-06 13:42

我认为老师的意思是输出的结果也应该是十进制,这是问题的关键。
十进制数和十六进制数在内存中的表示是不同的。
比如,MOV AX,27 ;AX中存的是1BH,也就是00011011。
而 MOV AX,27H;AX中存的是27H,也就是00100111。
要想加法得出组合的十进制数,一定要用MOV AX,27H才行。
我也说不大清楚了。

#9
汪洋2006-05-06 13:45
那两个十六进制数(27H,59H)其实就是两个十进制数(27,59)的BCD码。
#10
公子吕2006-05-06 14:00
楼上说的没错,老师就是要求把两个BCD码数相加得出结果也一个BCD码数
#11
T.O.E2006-05-06 14:04

DAA

执行操作:执行之前必须先执行ADDADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中.

不过我不太明白是什么意思.嘿嘿

#12
汪洋2006-05-06 15:32

在计算机中,ADD等指令对BCD码做运算也是用的与十六进制相同的进位方式,即满十六进一。
可是BCD码表示的十进制数却应该是满十进一。
因此,可以这样说,ADD对BCD码运算时,该进位的时候却没有进位,必然带来错误的结果。
DAA就是用来校正这个结果的,使结果成为一个正确的BCD码。

#13
仁者无敌2006-05-07 08:53
看一个高手给回的:
你老师的程序有语法错误!(当然也有可能是你抄错了)
DAA指令只能对AL中的结果进行十进制调整。
因此
ADD BX,AX
DAA
是错误的!

正确的写法应为:
MOV AL,59H
MOV BL,27H
ADD AL,BL
DAA

现在来进入正题:

你老师的题目为:编写程序实现将十进制数59与27相加

他的意思是让计算机直接十进制运算,就是结果要与十进制表示一样。
例如:十进制数59与27相加,其结果要形象的表示为86

而让计算机直接十进制运算的方案中有一个为:
将十进制翻译成二进制数去运算,然后对结果进行十进制调整,使之能得到正确的十进制的结果。

我们知道,计算机中的十进制数实际上是十进制数的二进制编码,简称为BCD码(Binary Coded Decimal)。
而在8086指令系统中,如果采用组合的8421-BCD码,即用一个字节表示2位十进制数。
那么:
十进制数35的应表示为:00110101B
写成16进制就为:35H
由此可见,35H能形象直接的表示十进制数的35

那么,题目中要求将十进制数59与27相加,则59写成16进制就为:59H;27写成16进制就为:27H。

当然直接让59H与27H相加的结果为80H,而我们知道十进制数59+27=86,可见59H与27H相加后的结果(80H)并不能形象直接的表示十进制数的86。

因此,还须进行十进制的加法调整,即加上DAA指令,在执行后,计算机会将所得结果80H自动加上06H,使结果为86H,
与十进制数的86相吻合。

当然DAA指令并不是总对结果加上06H,这要看加法后的结果如何,而相应采取不同的措施,但是,我们不用费神,这项工作是由计算机帮我们完成的,我们只要会用DAA指令就可以了。
1