x86汇编语言程序设计-长整数加法

x86汇编实现长整数加法
本文分享了使用x86汇编语言进行8位十进制整数加法的方法,包括直接相加和键盘输入求和两种情况,涉及mov、int、add等关键指令。

x86汇编语言程序设计-长整数加法

有关x86的汇编语言编程的帖子不多,这里上传一下有关简单长整数加法的x86代码,供大家参考

(1) (sum1.asm)编写一个8位十进制整数(用压缩的BCD码表示)加法, 两个整数保存在NUM1和NUM2中,结果保存在SUM中。用debug显示SUM的内容并截屏。
参考指令: mov,int,add,adc,daa,loop
运行截屏: 0vEjRf.png
源码:

;num1.asm
data segment
      num1 db 23H, 45H, 67H, 89H ;Integer 0x23456789
      num2 db 19H, 13H, 25H, 49H ;Integer 0x19132549
      sum db 4 dup(?)
data ends

code segment
          assume cs:code, ds:data
start:
       mov ax,data
       mov ds, ax
       
       call main
       
       mov ah,4ch              ; 功能:结束程序,返回DOS系统
       int 21h                 ; DOS功能调用
       
       
main proc
       mov cx, 4
       mov si, 3
again:
       mov ax,0
       mov bx, offset num1
       mov al, [bx+si]
       mov bx, offset num2
       adc al, [bx+si]
       daa
       mov sum[si], al
       dec si
       loop again
       
       ret
main endp

code  ends
      end start

(2) (sum2.asm)从键盘输入两个8位十进制整数,并采用压缩的BCD码保存在NUM1和NUM2中,然后把它们求和并保存在SUM中,最后把SUM的内容显示出来。
参考指令: mov,int,add,adc,daa,loop,shl,and
运行截屏: 0vEvz8.png
源码:

;num2.asm
data segment
      num1 db 4 dup(?)
      num2 db 4 dup(?)
      sum  db 4 dup(?)
data ends

code segment
          assume cs:code, ds:data
start:
       mov ax,data
       mov ds, ax
       call addnum             ;调用过程add进行加法 
	   call print			   ;调用过程print进行输出sum值 

       mov ah,4ch              ; 功能:结束程序,返回DOS系统
       int 21h                 ; DOS功能调用
       
       
addnum proc
              
       mov cx,4
       mov si,0
input1:
       mov ah,01h
       int 21h
       sub al,30h
       shl al,1
       shl al,1
       shl al,1
       shl al,1
       mov dl,al
       
       mov ah,01h
       int 21h
       sub al,30h
       add dl,al
       
       mov bx, offset num1
       mov [bx+si],dl
       inc si
       loop input1					;循环读入num1 
       
       mov dl,10					;输出回车换行,回车键ACSII值为10
       mov ah,02h       
       int 21h
       
       mov cx,4
       mov si,0

input2:
       mov ah,01h
       int 21h
       sub al,30h
       shl al,1
       shl al,1
       shl al,1
       shl al,1
       mov dl,al
       
       mov ah,01h
       int 21h
       sub al,30h
       add dl,al
       
       mov bx, offset num2
       mov [bx+si],dl
       inc si
       loop input2					;循环读入num2 
 
       mov cx, 4
       mov si, 3 
loadsum:
       mov ax,0
       mov bx, offset num1
       mov al, [bx+si]
       mov bx, offset num2
       adc al, [bx+si]
       daa
       mov sum[si], al
       dec si
       loop loadsum					;循环计算值并且存入sum 
       ret 
       
addnum endp



print proc
       mov dl,10                    ;输出回车换行,回车键ACSII值为10
       mov ah,02h       
       int 21h
       
       jnc next                     ;若最高位有进位,则向下执行,否则跳转至next 
       mov dl,'1'					;输出字符'1' 
       mov ah,02h       
       int 21h
next:
       mov bx, offset sum
       mov cx, 4
       mov si, 0
output:
       mov dl,[bx+si]
       and dl,11110000b
       shr dl,1
       shr dl,1
       shr dl,1
       shr dl,1
       add dl,'0'
       mov ah,02h       
       int 21h
       mov dl,[bx+si]
       and dl,00001111b
       add dl,'0'
       mov ah,02h       
       int 21h
       inc si
       loop output					;循环输出sum值 
	   ret
print endp	   
	   
code  ends
      end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值