section .bss
num1 resb 4
result resb 4
section .data
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
INCREMENT equ 1
msg1 db 'Please enter an integer here:',0xA
len1 EQU $- msg1
msg2 db 'Your integer after being incremented is:',0xA
len2 EQU $- msg2
section .text
global _start:
_start:
mov eax, SYS_WRITE ; Prompting user to enter a number.
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_READ ; Reading users number.
mov ebx, STDOUT
mov ecx, num1
mov edx, 4
int 0x80
mov eax, SYS_WRITE ; Writing second message.
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, [num1] ; incrementing the user's number.
mov ebx, INCREMENT
add eax, ebx
mov [result], eax
mov eax, SYS_WRITE ; Printing out incremented number.
mov ebx, STDOUT
mov ecx, result
mov edx, 4
int 0x80
刚刚开始学习基本汇编代码,我试图将用户输入数字增加1.当数字大于一位数时,我得到了奇怪的结果。有什么区别?
答案 0 :(得分:3)
问题在于您将输入视为数字而不是字符串。当您收到输入(字符串)时,您将获得一个(ASCII)字符串作为返回值。通过add eax, INCREMENT
(压缩)增加第一个字符(数字)确实有效,因为[num]
(EAX的最低字节)中包含的AL
的第一个ASCII字符值增加了1。发生这种情况是因为0
的ASCII值为48,而9
的ASCII值为57。
如果你认为你增加了这些数字',你实际上会增加它们的ASCII值,这在你达到一位数限制(0-9)之前效果很好。将9
增加一个将导致:
而不是10
,因为您可能已经预期,因为9
的ASCII值为57,并且向其添加一个结果为58,这是:
的ASCII值。
所以你必须正常化'你的号码'在使用整数运算对它们进行操作之前。将它们从ASCII字符串转换为整数值。
幸运的是,其他人已经在你面前做到了这一点,并将这些方法优化到实际的最大值。查看并搜索atoi
(ASCII到整数)和itoa
(整数到ASCII)。然后围绕你的算术运算
mov eax, [num1] ; incrementing the user's number.
mov ebx, INCREMENT
add eax, ebx
mov [result], eax
有这些功能。