masm汇编语言任意两个20位以内十进制数求和 显示结果
时间: 2023-11-12 17:04:21 浏览: 201
好的,以下是masm汇编语言 x86 32位体系结构的代码,用于实现任意两个20位以内十进制数求和并显示结果:
```asm
.386
.model flat, stdcall
option casemap:none
include \masm32\include\msvcrt.inc
includelib \masm32\lib\msvcrt.lib
.data
num1 db 21 dup(?) ; 第一个数,最大为20位
num2 db 21 dup(?) ; 第二个数,最大为20位
sum db 22 dup(?) ; 存放两数之和,最大为21位
nl db 10 ; 换行符
.code
_start:
; 读取num1
push offset num1 ; 存放输入值的内存地址
push 20 ; 输入值的最大长度
push offset stdin ; 文件句柄:标准输入
call _fgetws ; 调用fgetws函数,读取标准输入
add esp, 12 ; 清空栈
; 读取num2
push offset num2 ; 存放输入值的内存地址
push 20 ; 输入值的最大长度
push offset stdin ; 文件句柄:标准输入
call _fgetws ; 调用fgetws函数,读取标准输入
add esp, 12 ; 清空栈
; 将num1和num2转换为十进制整数
lea eax, num1 ; 将num1的地址存入eax
push eax ; 将num1的地址存入栈
call ascii_to_int ; 调用ascii_to_int函数,将num1转换为十进制整数
push eax ; 将num1的值存入栈
lea eax, num2 ; 将num2的地址存入eax
push eax ; 将num2的地址存入栈
call ascii_to_int ; 调用ascii_to_int函数,将num2转换为十进制整数
add eax, [esp + 4] ; 将num1和num2的和存入eax
add esp, 8 ; 清空栈
; 将和转换为ASCII码
push eax ; 将和存入栈
lea eax, sum ; 将sum的地址存入eax
call int_to_ascii ; 调用int_to_ascii函数,将和转换为ASCII码
add esp, 4 ; 清空栈
; 输出和
push offset sum ; 存放输出值的内存地址
push offset stdout ; 文件句柄:标准输出
call _fputws ; 调用fputws函数,输出到标准输出
add esp, 8 ; 清空栈
; 输出换行符
push offset nl ; 存放输出值的内存地址
push offset stdout ; 文件句柄:标准输出
call _fputws ; 调用fputws函数,输出到标准输出
add esp, 8 ; 清空栈
; 退出程序
push 0 ; 返回值:0
call _exit ; 调用exit函数,退出程序
; 将ASCII码转换为十进制整数
; 输入:
; eax - 存放ASCII码的内存地址
; 输出:
; eax - 十进制整数
ascii_to_int:
push ebx ; 用ebx存放结果
push edx ; 用edx存放位权
xor ebx, ebx ; ebx清零
xor edx, edx ; edx清零
.loop:
movzx ecx, byte ptr [eax] ; 将ASCII码转换为整数
cmp ecx, 0x0A ; 判断是否到达数字末尾
je .exit ; 如果到达数字末尾,跳出循环
imul edx, edx, 10 ; 计算当前位数的位权
add ebx, ecx ; 将当前位数的值累加到结果中
inc eax ; 指向下一个数字
jmp .loop ; 继续循环
.exit:
mov eax, ebx ; 将结果存入eax
add esp, 8 ; 清空栈
ret ; 返回
; 将十进制整数转换为ASCII码
; 输入:
; eax - 十进制整数
; 输出:
; eax - 存放ASCII码的内存地址
int_to_ascii:
push esi ; 用esi存放结果
push ecx ; 用ecx存放当前位的ASCII码
push edx ; 用edx存放当前位数
mov esi, eax ; 将十进制整数存入esi
lea eax, [esp + 12] ; 将存放输出值的内存地址存入eax
mov byte ptr [eax], 0 ; 在末尾处添加字符串结束标志
.loop:
xor edx, edx ; edx清零
div dword ptr [esp + 12] ; 将esi除以10,余数存入edx,商存入esi
add dl, '0' ; 将余数转换为ASCII码
mov byte ptr [eax], dl ; 将ASCII码存入内存
dec eax ; 指向下一个内存地址
inc dword ptr [esp + 12] ; 增加当前位数的值
test esi, esi ; 判断商是否已经为0
jnz .loop ; 如果商不为0,则继续循环
mov eax, [esp + 4] ; 将存放输出值的内存地址存入eax
add esp, 12 ; 清空栈
ret ; 返回
```
这段代码使用了 `fgetws` 和 `fputws` 函数来读取用户输入和输出结果,同时还包含了两个子函数 `ascii_to_int` 和 `int_to_ascii`,用于将ASCII码转换为十进制整数和将十进制整数转换为ASCII码。你可以将上述代码保存到一个文件中(例如 `sum.asm`),然后使用masm汇编器将其转换为可执行文件,例如:
```
> ml /c /coff sum.asm
> link /subsystem:console sum.obj msvcrt.lib
```
然后运行可执行文件即可开始使用。
阅读全文