输入一个十进制数转换为ASCII码汇编语言
时间: 2023-12-17 20:05:14 浏览: 248
下面是一个 x86 汇编实现将用户输入的十进制数转换为对应的 ASCII 码值并输出的例子:
```assembly
section .data
prompt db "请输入一个整数:", 0
output db 20 dup('$') ; 存储输出结果的缓冲区
section .text
global main
main:
; 输出提示信息
mov eax, 4 ; 4 表示 sys_write
mov ebx, 1 ; 1 表示 stdout
mov ecx, prompt
mov edx, 14
int 0x80
; 读取用户输入的十进制数
mov eax, 3 ; 3 表示 sys_read
mov ebx, 0 ; 0 表示 stdin
mov ecx, output
mov edx, 20
int 0x80
; 将输入的字符串转换为整数
xor eax, eax
mov edi, output
mov bl, [edi] ; 检查第一个字符是否为负号
cmp bl, '-'
jne check_digit
; 如果第一个字符是负号,跳过它
inc edi
check_digit:
; 从左到右遍历输入字符串,将每个数位上的数字相加
loop:
; 如果遍历到字符串末尾,跳出循环
cmp byte [edi], 0
je done
; 如果遍历到非数字字符,跳出循环
cmp byte [edi], '0'
jl done
cmp byte [edi], '9'
jg done
; 将之前的结果乘以 10,并加上当前数位上的数字
movzx ebx, byte [edi]
sub ebx, '0'
mov eax, eax, 10
add eax, ebx
; 指针指向下一个字符
inc edi
; 继续循环
jmp loop
done:
; 如果第一个字符是负号,将结果取反
cmp bl, '-'
jne to_ascii
neg eax
to_ascii:
; 将整数转换为对应的 ASCII 码值
xor ecx, ecx ; ecx 存储输出缓冲区的偏移量
mov edi, output
; 如果整数为 0,直接输出 '0'
test eax, eax
jnz not_zero
mov byte [edi], '0'
inc edi
jmp done_output
not_zero:
; 如果整数为负,先输出负号
test eax, eax
jns positive
mov byte [edi], '-'
inc edi
neg eax
positive:
; 将整数除以 10,得到商和余数
mov edx, 0
mov ebx, 10
div ebx
; 将余数转换为 ASCII 码值,存储到输出缓冲区
add dl, '0'
mov [edi], dl
inc edi
; 如果商不为 0,重复上述步骤
test eax, eax
jnz positive
done_output:
; 反向输出结果
mov ecx, edi ; ecx 存储输出缓冲区的末地址
dec edi
; ecx 和 edi 向中间靠拢,直到相遇
mov ebx, ecx
sub ebx, output
shr ebx, 1
reverse:
; 交换 ecx 和 edi 指向的字节
mov al, [ecx]
mov dl, [edi]
mov [ecx], dl
mov [edi], al
; ecx 和 edi 向中间靠拢
inc ecx
dec edi
; 如果还未相遇,继续循环
cmp ecx, ebx
jle reverse
; 输出结果
mov eax, 4 ; 4 表示 sys_write
mov ebx, 1 ; 1 表示 stdout
mov ecx, output
sub ecx, output ; 输出缓冲区的偏移量
mov edx, edi
sub edx, output ; 输出缓冲区的长度
int 0x80 ; 调用 Linux 系统调用
; 退出程序
mov eax, 1 ; 1 表示 sys_exit
xor ebx, ebx
int 0x80
```
上述代码将用户输入的十进制数转换为对应的 ASCII 码值并输出。如果用户输入的字符串不是合法的十进制数,程序会输出错误结果。
阅读全文