Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops NASM:将多字符输入转换为十进制_Loops_Assembly_X86_Nasm - Fatal编程技术网

Loops NASM:将多字符输入转换为十进制

Loops NASM:将多字符输入转换为十进制,loops,assembly,x86,nasm,Loops,Assembly,X86,Nasm,我试图写一个程序,得到一个数字与一个或两个数字,并写你好!是那个数字的两倍 我用这些帖子来写我的代码: 我不明白这一点: 但是我的代码只对两位数有效,而对一位数的结果是错误的 我的代码: section .data msg db 'Hello!',0xA len equ $-msg section .bss n resb 2 section .text global _start _start: ;get n mov edx, 2 m

我试图写一个程序,得到一个数字与一个或两个数字,并写你好!是那个数字的两倍

我用这些帖子来写我的代码: 我不明白这一点:

但是我的代码只对两位数有效,而对一位数的结果是错误的

我的代码:

section .data
    msg db 'Hello!',0xA
    len equ $-msg

section .bss
    n resb 2

section .text
    global _start

_start:
    ;get n
    mov edx, 2
    mov ecx, n
    mov ebx, 0
    mov eax, 3
    int 0x80

    lea     esi,[n]     ;address of our text
    call    toint

    ;loop for print 'Hello!\n'
    print_loop:
        push ecx
        mov edx, len
        mov ecx, msg
        mov ebx, 1
        mov eax, 4
        int 0x80    
        pop ecx
    loop print_loop

mov eax, 1
int 0x80


toint:
    push    eax
    push    ebx
    xor     ebx, ebx
    next_digit:
        movzx   eax, byte[esi]      
        sub     al , '0'
        imul    ebx, 10
        add     ebx, eax
        inc     esi
        cmp     byte [esi] , 0x0    ;check next character is null or not
        jne     next_digit
    ; end_loop:
    mov     ecx, ebx
    pop     eax
    pop     ebx
ret
sys_read调用在EAX中返回发送到inputbuffer的字符数。由于允许输入最多2个字符,因此此计数将为0、1或2。您可以在toint例程中使用此信息

请注意,在堆栈上保留/恢复寄存器时,需要遵守相反的顺序!你的代码漏掉了这个

四点提示 a。首选MOV变量来加载地址。它总是一个简短的指令。 B防止输入为零。 C不要使用循环。这是一个缓慢的指令。 D提供退出代码以终止程序

    mov     esi, n      ; (a)
    call    toint       ; -> ECX
    jecxz   Exit        ; (b)
print_loop:
    ...
    dec     ecx         ; (c)
    jnz     print_loop
Exit:
    xor     ebx, ebx    ; (d)
    mov     eax, 1
    int     0x80

对于单个数字,您的输入将包括行尾字符,因为缓冲区中有足够的空间。无论如何,您都不应该检查零终止符,因为您没有添加任何终止符。让你的缓冲区足够大,以达到最大大小和换行,然后检查。为了完全安全,还要检查read的返回值。@Jester谢谢。它起作用了。这是非常重要的一点:
    mov     esi, n      ; (a)
    call    toint       ; -> ECX
    jecxz   Exit        ; (b)
print_loop:
    ...
    dec     ecx         ; (c)
    jnz     print_loop
Exit:
    xor     ebx, ebx    ; (d)
    mov     eax, 1
    int     0x80