我编写了一个程序,要求插入一个值:如果值小于或等于100,则程序退出,没有错误;否则,它打印错误消息并退出。不幸的是,当我插入大于100的值时,它从不打印错误消息,所以在转换输入刺时可能会出现一些问题,但我不知道在哪里!下面是代码:
.section .data
 str:
    .ascii "Insert value:\n"
 str_len:
    .long . - str   
 err:
    .ascii "Error\n"
 err_len:
    .long . - err       
 car:
    .byte 0     
 .section .text
    .global _start  
 _start:
    movl $4, %eax     #print string with sys read
    movl $1, %ebx
    leal str, %ecx
    movl str_len, %edx
    int $0x80
    xorl %eax, %eax
 again:
    pushl %eax          #save eax on stack
    movl  $3, %eax      # read from keyboard with sys write
    xorl  %ebx, %ebx    
    leal  car, %ecx     
    mov   $1, %edx      # read 1 char at the time
    int   $0x80         
    cmp   $10, car      # if it reads '\n' then end
    je    end
    subb  $48, car      # else it converts ASCII code of char to correspondent values
    popl  %eax
    movl  $10, %ebx
    mull  %ebx          # eax = eax * 10 + car  
    addl  car, %eax 
    jmp   again 
end:
    popl %eax  
    cmpl $100, %eax
    jg error
error:
    movl $4, %eax       #print error message
    movl $1, %ebx
    leal err, %ecx
    movl err_len, %edx
exit:  
    movl $1, %eax
    xorl %ebx, %ebx
    int $0x80发布于 2016-01-14 12:41:45
在您的代码中有一些问题:
此指令将导致32位比较(cmpl):
cmp   $10, car因此,您需要指定使用cmpb进行8位比较。
在程序的error部分,您忘记了int $0x80,所以它不会打印任何内容。
您已经得到了一个jg error,但是error:标签就在下一行,所以不管跳转是否进行,您都会在那里结束。应该将跳转更改为jng exit。
https://stackoverflow.com/questions/34789257
复制相似问题