为什么递增对于较大的数字而言不像单个数字那样相同?

时间:2016-04-16 20:52:12

标签: linux assembly x86 nasm increment

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.当数字大于一位数时,我得到了奇怪的结果。有什么区别?

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

有这些功能。