汇编程序停留在sys_read循环中

时间:2016-01-07 14:22:07

标签: loops assembly ascii infinite-loop system-calls

我写了一段代码,从提示符中取一个ASCII字符的数字,将其转换为十进制数字并将其存储在' dnumber'中。转换已经过检查并且运行良好。它在提示时出错了。它在向用户询问ASCII字符编号时似乎陷入了无限循环。当用户按下ENTER时,我希望程序停止询问输入,但即使我认为我已经设置了那个终止值,也似乎没有达到终止值。

我最近在这个论坛上问了两个相关的问题,结果表明我不能正确理解系统调用。我已阅读了关于' http://www.tutorialspoint.com/assembly_programming',' http://cs.lmu.edu/~ray/notes/nasmtutorial/'的所有文档。和一些' http://www.x86-64.org/documentation/abi.pdf'而且显然我还没有得到它。希望你能告诉我光明。

以下是编译器信息:

nasm -f elf64 convinput.asm
 ld -s -o convinput convinput.o

以下是提示:

$ ./convinput
Enter a number and press enter: 
123

123
123

正如您所看到的,我已按两次ENTER,但提示仍然要求输入。

以下是代码:

section     .text

global _start

_start:

    mov     eax, 4
    mov     ebx, 1
    mov     edx, lenmsg1
    mov     ecx, msg1
    int     80h

    xor     eax, eax
    xor     ebx, ebx
    xor     edx, edx
    mov     esi, data
    call    input

    mov     esi, data
    movzx   ecx, byte [dignum]
    xor     ebx,ebx    ; clear ebx

    call    string_to_int

    mov     dword [dnumber], eax

    mov     eax, 1
    mov     ebx, 0
    int     80h

input:
    mov  eax, 3
    mov  ebx, 0
    mov  ecx, esi
    mov  edx, 1
    int  80h

    inc  byte [dignum]
    cmp  byte [esi], 13
    inc  esi
    jne  input
    ret

string_to_int:
  xor   ebx,ebx
  movzx eax, byte [esi]
  inc   esi
  sub   al,'0'    ; convert from ASCII to number4
  mov   ebx, 10
  mul   ebx
  add   ebx,eax   ; ebx = ebx*10 + eax  
  dec   byte [dignum]
  cmp   byte [dignum], 0
  jne   string_to_int
  mov   eax,ebx
  ret


section .bss

    dignum  resb 1
    data    resb 1000
    dnumber resd 1
section .data
    msg1 db 'Enter a number and press enter: ', 10, 0
    lenmsg1 equ $ -msg1

    ; ESI = pointer to the string to convert
    ; ECX = number of digits in the string (must be > 0)
    ; Output:
    ; EAX = integer valu

1 个答案:

答案 0 :(得分:0)

根据你放入eax的值来判断你使用的是32位系统调用表,它在linux上与64位不同。

您可以通过在strace下运行程序轻松查看调用的系统调用(以及使用哪些参数)。