汇编实现15位加法(带输入和输出)

本文介绍了如何用汇编语言实现15位加法,包括输入和输出功能。难点在于加法函数,作者尝试了两种方法,最终采用将较短数右移并补0的方法。程序中存在一个小错误,即extrn拼写错误,已修正。目前程序只能处理15位加法,且前导零不正确显示,计划后续改进。
摘要由CSDN通过智能技术生成

  最近两天一直在想可不可以用汇编做15位加法,带输入和输出的那种,经过调试,大致的思路如下。

  有一个输入函数input,它接受从键盘输入的字符,并转换为数字存入内存;有一个输出函数output,它将已经转换过的结果输出;有一个加法函数plus,它实现的功能是把输入的两个数相加,并处理为ASCII码字符。

  input、output以及main函数都相对简单,我认为难点主要是在plus函数这一块。

  我刚开始想用两个指针分别指向两个数据,然后通过移动指针将数据相加,后来我发现这个方法有点麻烦(主要是不确定两个数据的长度是否一样,然后是否有进位);后来想到了另外一种方法,浮点数相加需要对阶,这里的加法也可以将短的数向右移(是整个数据右移,不是指移位操作),然后前面用0来补位,然后就方便处理了。

  具体的代码如下:

extrn input:far,output:far,plus:far
public num1,num2,result

data segment
	num1 db 16 dup(0)				; 存放已经经过转化的十进制数据
	num2 db 16 dup(0)
	result db 17 dup(0ffh),'$'
	onceMore db 10,'Do you want to add your numbers once more(y/n): $'
data ends 

code segment
assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax
	;--------------------------------------------------------------------
mainProces
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是汇编语言实现两个四加法程序的代码: ``` section .data num1 db 0 num2 db 0 result db 0 section .text global _start _start: ; 输入第一个 mov eax, 3 ; 系统调用号:读 mov ebx, 0 ; 标准输入设备文件描述符:0 mov ecx, num1 ; 缓冲区地址 mov edx, 4 ; 缓冲区大小:4字节 int 0x80 ; 调用系统调用 ; 输入第二个 mov eax, 3 ; 系统调用号:读 mov ebx, 0 ; 标准输入设备文件描述符:0 mov ecx, num2 ; 缓冲区地址 mov edx, 4 ; 缓冲区大小:4字节 int 0x80 ; 调用系统调用 ; 将两个转换为字 mov eax, num1 sub eax, 0x30 ; ASCII码转字 mov ebx, 10 mul ebx ; eax = num1 * 10 mov ebx, eax mov eax, num2 sub eax, 0x30 ; ASCII码转字 add eax, ebx ; eax = num1 * 10 + num2 ; 计算结果 mov ebx, 10 xor ecx, ecx ; ecx 用于存放进 .loop: mov edx, 0 ; edx 用于存放余 div ebx ; eax / ebx,结果存放在 eax 中,余存放在 edx 中 add al, cl ; 加上进 daa ; 双调整指令,用于处理进 mov cl, ah ; cl 存放低的进 mov ah, 0 ; ah 存放高 push ax ; 将低存入栈中 cmp eax, 0 ; 若 eax 等于 0,则说明所有都处理完了 jne .loop ; 否则继续循环 .pop: pop ax ; 取出栈中的据 add al, cl ; 加上进 daa ; 双调整指令,用于处理进 mov cl, ah ; cl 存放低的进 mov ah, 0 ; ah 存放高 cmp ax, 0 ; 若 ax 等于 0,则说明所有都处理完了 jne .pop ; 否则继续循环 ; 将结果转换为字符串 mov ebx, 0ah ; ebx 存放换行符 mov ecx, result ; ecx 存放结果的地址 .loop2: xor edx, edx ; edx 用于存放余 div ebx ; eax / ebx,结果存放在 eax 中,余存放在 edx 中 add dl, 0x30 ; 字转 ASCII 码 mov [ecx], dl ; 将结果存入内存 inc ecx ; 指向下一个字符 cmp eax, 0 ; 若 eax 等于 0,则说明所有都处理完了 jne .loop2 ; 否则继续循环 ; 输出结果 mov eax, 4 ; 系统调用号:写 mov ebx, 1 ; 标准输出设备文件描述符:1 mov ecx, result ; 缓冲区地址 sub ecx, result ; ecx 存放结果的长度 add ecx, ecx ; 因为一个字符占一个字节,所以长度需要乘以2 add ecx, result ; ecx 指向结果的起始地址 int 0x80 ; 调用系统调用 ; 退出程序 mov eax, 1 ; 系统调用号:退出 xor ebx, ebx ; 返回值为 0 int 0x80 ; 调用系统调用 ``` 这是一个简单的加法程序,可以实现两个四加法程序的思路是先将两个转换为字,然后从低到高依次计算每一的和,并将结果存入栈中,最后将栈中的据取出来,并将结果转换为字符串输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值