加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

80x86汇编:多字节数相加的编程方法

(2019-02-03 23:05:52)
标签:

it

分类: 80x86

有一个多字节运算、显示的问题。

基本要求:
  将两个4字节数相加,要求被加数、加数按顺序存放在
  以DATA1和DATA2为首的4个单元中(低位在前)。
  相加后的和放在DATA3开始的5个单元(考虑最高字节的进位)。

扩展要求:
  把两个加数相加的表达式和相加的结果显示在屏幕上。

做而论道编程如下:
;======================================================
CCC  SEGMENT
           ;4294967295
    X   DD  1357924680     ;加数4字节: 0~4294967295
    Y   DD  3943298877
    Z   DB  0, 0, 0, 0, 0  ;和为5字节
    NN  DW  4              ;字节数
    JV  DB  10             ;以10进制显示
;-----------------------------------
BG: PUSH  CS               ;程序开始
    POP   DS

    MOV   AX, WORD  PTR  X
    ADD   AX, WORD  PTR  Y
    MOV   WORD  PTR  Z, AX

    MOV   AX, WORD  PTR  X + 2
    ADC   AX, WORD  PTR  Y + 2
    MOV   WORD  PTR  Z + 2, AX

    MOV   AL, 0
    ADC   AL, 0
    MOV   BYTE  PTR  Z + 4, AL
    
;下面以10进制显示出整个算式

    LEA   SI, X
    LEA   DI, X
    CALL  DISP_N_BYTE
    MOV   DL, '+'
    INT   21H
    LEA   SI, Y
    LEA   DI, Y
    CALL  DISP_N_BYTE
    MOV   DL, '='
    INT   21H
    MOV   NN, 5
    LEA   SI, Z
    LEA   DI, Z
    CALL  DISP_N_BYTE

QUIT:
    MOV   AH, 4CH     ;Return to DOS
    INT   21H
;-----------------------------------
DISP_N_BYTE:
    MOV   BP, SI
    MOV   DX, 0
@@: CALL  DIV_N_BYTE
    MOV   AL, AH
    PUSH  AX
    INC   DX
    CALL  TEST_0
    CMP   AL, 0
    JNE   @B

    MOV   AH, 2
    MOV   CX, DX
@@: POP   DX
    ADD   DL, 30H
    INT   21H
    LOOP  @B
    RET
;-----------------------------------
DIV_N_BYTE:
    MOV   AH, 0
    MOV   BX, NN
    DEC   BX
    MOV   CX, NN
@@: MOV   AL, [SI + BX]
    DIV   JV
    MOV   [DI + BX], AL
    DEC   BX
    LOOP  @B
    ; MOV 余数,AH
    RET
;-----------------------------------
TEST_0:
    PUSH  SI
    MOV   AL, 0
    MOV   BX, 0
    MOV   CX, NN
    MOV   SI, BP
@@: OR    AL, [SI + BX]
    INC   BX
    LOOP  @B
    POP   SI
    RET
;-----------------------------------
CCC  ENDS
    END   BG
;======================================================

本程序运行后,显示如下:

D:\masm6.15>EAM
1357924680+3943298877=5301223557

对不对呢?大家可用计算器验算一下。

相加、相减,两种计算的编程方法,都是一样的。
有兴趣的读者,自己试试吧。

阅读(774)| 评论(34) |删除 |推送 |置顶

;======================================================
评论:

2017-06-19 19:20
1339454742
您好,我想问下中间那个@@和@B是什么啊?可否告知


2017-06-19 21:38
做而论道 回复 1339454742
@@,是自定义的标号。


2017-06-19 21:39
做而论道 回复 1339454742
@B,是转移到上边的@@去。


2017-06-19 21:41
1339454742 回复  做而论道
上一个@@么?


2017-06-20 08:11
做而论道 回复 1339454742
为什么要这样问?我说的,不清楚吗?


2017-06-20 08:19
1339454742 回复  做而论道
因为老师在讲这门课的时候很多东西没讲。所以我不是很懂这门课。所以求助博主。


2017-06-20 08:33
做而论道 回复 1339454742
@B,是转移到上边的@@去。这还有什么不清楚的?


2017-06-20 08:42
1339454742 回复  做而论道
这样做不对呀。第一个@B转向哪?


2017-06-20 08:55
做而论道 回复 1339454742
程序都能正常执行,怎能可能不对?


2017-06-20 10:29
1339454742 回复  做而论道
博主,我第一个是@@,然后第一个@B改为@@,后面的改为@A,@B,@C,里面的@B也这样改的,然后显示的是1357924680+0=1357924680,这是为什么啊


2017-06-20 10:50
做而论道 回复 1339454742
为什么?这还用问?
原程序是完全正确的。
你改了,就难免出错。


2017-06-20 10:54
1339454742 回复  做而论道
这样改也有错啊,,,


2017-06-20 16:29
牟小飞
我把代码复制下来之后,用emu8086编译不通过,@@报错,网上搜了一下,说是@@只对于masm有效,我不知道这个是不是报错的原因


2017-06-20 17:24
做而论道 回复 牟小飞
哦,应该是这样。
正统的编译软件是微软的 MASM。
EMU8086,是山寨软件,不识别 @@ 也很正常。


2017-06-20 17:28
做而论道 回复 牟小飞
实在是想用 EMU8086,你可以自己改动一下。
@@,你可以自己改名,如:XX1;
下面的 @B,就要改成:XX1。

再往下的:@@、@B,都改成:XX2;
。。。

即可。


2017-06-19 21:42
做而论道
以 @@ 为标号,是可以重复使用的。就不用费心琢磨:这里该写个什么呢?


2017-06-19 21:50
1339454742 回复  做而论道
那个。。。@B我还是没搞懂,调试了几次都不行,您可以具体点么,那四个@@就当做1234吧


2017-06-20 07:48
做而论道 回复 1339454742
程序,我都编好了。你还有什么可调试的?


2017-06-20 07:50
做而论道 回复 1339454742
那四个@@就当做1234吧--这可不行。


2017-06-20 07:52
做而论道 回复 1339454742
你用 DEBUG 单步跟踪一下,即可知道 @@ 和 @B 的关系。


2017-06-20 08:06
1339454742 回复  做而论道
额。。我们老师只教我们简单的使用了8086,没有教我们debug。所以那四个@B关系不清楚的话用不了。还望理解


2017-06-20 08:09
做而论道 回复 1339454742
用不了?能用的。程序,都编好了,你编译、连接后,即可运行。


2017-06-20 08:18
1339454742 回复  做而论道
用不了。因为那四个@B的指向我没弄懂,所以运行的时候总是卡在某一段或者无法实现。所以求助博主。能否把那四个@B的指向告诉我?


2017-06-20 08:30
做而论道 回复 1339454742
什么是用不了?本程序运行很正常。


2017-06-20 08:32
做而论道 回复 1339454742
总是卡在某一段或者无法实现--那么,显示什么呢?


2017-06-20 08:42
1339454742 回复  做而论道
额。我也不知道怎么说。博主您就说说那四个@B指向哪。我回去调试试试吧


2017-06-20 08:45
做而论道 回复 1339454742
@B,是转移到上边的@@去。


本程序运行很正常,显示如下:
1357924680+3943298877=5301223557


2017-06-20 08:49
1339454742 回复  做而论道
那第一个@B转移到哪。。


2017-06-20 08:51
做而论道 回复 1339454742
我所发表的程序,个个都是能够正常执行的。
绝没有【卡在某一段或者无法实现】的现象。

你调试时,可以改变数值;不要改变程序。
改了程序,就错了。
你即使不出错,也没有我写的简练。

我所写的,都是最精练的代码。
根本就没有继续提高的空间。


2017-06-20 08:54
做而论道 回复 1339454742
任何一个@B,都是转移到它上边的@@去。


2017-06-20 08:58
1339454742 回复  做而论道
好吧。一会回去我看看我哪里出错了。谢谢博主


2017-06-20 09:05
做而论道 回复 1339454742
那第一个@B转移到哪。。
--转移到它上边的@@去。
--它上边,原有个@@,没有吗?
--显然,是被你删除了。
--呵呵


2017-06-20 09:08
做而论道 回复 1339454742
你把网页上的原程序复制下来,肯定就是无错的。
有错,就是你自己改动了。


2017-06-20 09:09
1339454742 回复  做而论道
一会我回去试试吧

说明:
做而论道,是本博主在百度开博时用的昵称。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有