汇编语言任意两个10位以内十进制数求和 显示结果
时间: 2023-11-21 11:04:34 浏览: 174
好的,以下是汇编语言 x86 32位体系结构的代码,用于实现任意两个10位以内十进制数求和并显示结果:
```assembly
section .data
num1 db 10 ; 第一个数,最大为10位
num2 db 10 ; 第二个数,最大为10位
sum db 12 ; 存放两数之和,最大为11位
nl db 10 ; 换行符
section .text
global _start
_start:
; 读取num1
mov eax, 3 ; 系统调用号:读取标准输入
mov ebx, 0 ; 文件句柄:标准输入
mov ecx, num1 ; 存放输入值的内存地址
mov edx, 10 ; 输入值的最大长度
int 0x80 ; 执行系统调用
; 读取num2
mov eax, 3 ; 系统调用号:读取标准输入
mov ebx, 0 ; 文件句柄:标准输入
mov ecx, num2 ; 存放输入值的内存地址
mov edx, 10 ; 输入值的最大长度
int 0x80 ; 执行系统调用
; 将num1和num2转换为十进制整数
mov eax, num1 ; 将num1的地址存入eax
mov ebx, 0 ; 用ebx存放结果
call ascii_to_int ; 调用ascii_to_int函数,将num1转换为十进制整数
mov eax, ebx ; 将结果存入eax
mov ebx, 0 ; 清空ebx
mov ecx, num2 ; 将num2的地址存入ecx
call ascii_to_int ; 调用ascii_to_int函数,将num2转换为十进制整数
add eax, ebx ; 将num1和num2的和存入eax
; 将和转换为ASCII码
mov ebx, eax ; 将和存入ebx
mov eax, 0 ; 用eax存放结果
mov ecx, sum ; 将sum的地址存入ecx
call int_to_ascii ; 调用int_to_ascii函数,将和转换为ASCII码
; 输出和
mov eax, 4 ; 系统调用号:输出到标准输出
mov ebx, 1 ; 文件句柄:标准输出
mov ecx, sum ; 存放输出值的内存地址
mov edx, 11 ; 输出值的长度
int 0x80 ; 执行系统调用
; 输出换行符
mov eax, 4 ; 系统调用号:输出到标准输出
mov ebx, 1 ; 文件句柄:标准输出
mov ecx, nl ; 存放输出值的内存地址
mov edx, 1 ; 输出值的长度
int 0x80 ; 执行系统调用
; 退出程序
mov eax, 1 ; 系统调用号:退出程序
xor ebx, ebx ; 返回值:0
int 0x80 ; 执行系统调用
; 将ASCII码转换为十进制整数
; 输入:
; eax - 存放ASCII码的内存地址
; 输出:
; ebx - 十进制整数
ascii_to_int:
mov ebx, 0 ; 用ebx存放结果
mov edx, 0 ; 用edx存放位权
.loop:
movzx ecx, byte [eax] ; 将ASCII码转换为整数
cmp ecx, 0x0A ; 判断是否到达数字末尾
je .exit ; 如果到达数字末尾,跳出循环
imul edx, edx, 10 ; 计算当前位数的位权
add ebx, ecx ; 将当前位数的值累加到结果中
inc eax ; 指向下一个数字
jmp .loop ; 继续循环
.exit:
ret ; 返回
; 将十进制整数转换为ASCII码
; 输入:
; ebx - 十进制整数
; 输出:
; eax - 存放ASCII码的内存地址
int_to_ascii:
mov edi, ecx ; 将存放输出值的内存地址存入edi
add ecx, edx ; 计算存放输出值的内存地址的末尾
mov byte [ecx], 0 ; 在末尾处添加字符串结束标志
.loop:
xor edx, edx ; edx清零
div dword 10 ; 将ebx除以10,余数存入edx,商存入ebx
add dl, '0' ; 将余数转换为ASCII码
mov byte [ecx], dl ; 将ASCII码存入内存
dec ecx ; 指向下一个内存地址
test ebx, ebx ; 判断商是否已经为0
jnz .loop ; 如果商不为0,则继续循环
mov eax, edi ; 将存放输出值的内存地址存入eax
ret ; 返回
```
这段代码使用了系统调用来读取用户输入和输出结果,同时还包含了两个子函数 `ascii_to_int` 和 `int_to_ascii`,用于将ASCII码转换为十进制整数和将十进制整数转换为ASCII码。你可以将上述代码保存到一个文件中(例如 `sum.asm`),然后使用汇编器将其转换为可执行文件,例如:
```
$ nasm -f elf32 sum.asm -o sum.o
$ ld -m elf_i386 sum.o -o sum
```
然后运行可执行文件即可开始使用。
阅读全文