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

多字节的二进制加法程序

筐筐的橙 发布于 2011-06-05 14:47, 4431 次点击
下面是实验题目:
  1.实验内容
将两个4字节长的二进制数相加,运算结果存放在相应结果单元中。
2.说明
首先应安排程序的结构,其中代码段和数据段是必须有的。代码段里实现数的相加,可用带
进位的加法指令;数据段中存放被加数、加数和结果单元这些数据。考虑到编程的方便,在定义加数和被加数时,将低位字节放到低地址,高位字节放在高地址。进行加法运算时,按照由低地址到高地址的顺序取得数据,而每一步运算的结果也按照低位放在低地,高位放在高地址的方式进行存储

说明看的有点蒙,就编了个:


DATAS SEGMENT
    DATA1 DD 12345678H
    DATA2 DD 0ABCDEF01H
    DATA3 DW 2 DUP(0);此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV BP,0
    LEA SI,DATA1                  ;取两个数据的首地址
    LEA DI,DATA2
    MOV AX,[SI]
    ADD AX,[DI]                   ;后四位相加
    JC L                           ;判断是否进位
    MOV 4[DATA3],AX                ;后四位存入DATA3
    MOV AX,0

K:  MOV AX,4[SI]                  ;前四位相加
    ADD AX,4[DI]
    JMP J
L:  MOV AX,1                      ;有进位AX先加一
    JMP K
J:  MOV [DATA3],AX                ;前四位存入DATA3
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

估计错误的地方比较多,需要大修=v=,,,求高手帮指点下。

5 回复
#2
obstratiker2011-06-05 20:50
思路是没有错的
但是        MOV 4[DATA3],AX                ;后四位存入DATA3
            MOV AX,0                                            

得放在      JC L  之前
不然有进位就不执行前两句了


……不过你直接用 ADD 和 ADC  的指令更方便
mov ax,(data1)
mov dx,(data2)
add ax,(data2)
adc dx,(data2)
具体怎么用自己查查吧
#3
筐筐的橙2011-06-05 23:50
我把JC L放到后面这样运行了,但是怎么证明它的结果是对的呢?d命令出来完全看不出什么啊~
#4
obstratiker2011-06-06 11:33

看不出来是什么意思……
你的数是存入 data3 里了,但是位置放错了(晕,尽管昨天我没 debug 出来,你好歹也尽量查查错啊)

后四位放入  2[data3] 中,你的定义是  dw 只有 2 字节
所以按你的程序运行,
data3 内存中就是
01 ef 00 00 79 45
多出一个字的空间来
#5
guoweiya2012-10-06 21:12
回复 4楼 obstratiker
请问一下,地址偏移量是4吗?不应该是2?
#6
guoweiya2012-10-06 21:13
回复 4楼 obstratiker
取data1和data2前四位的时候偏移量是不是也应该是2?
1