Assembly 8086 - 从键盘读取值并将其与另一个值

时间:2016-01-14 12:07:55

标签: ubuntu assembly x86

我写了一个程序,要求插入一个值:如果该值小于或等于100,程序退出没有错误;否则它会输出错误信息并退出。 不幸的是,当我插入一个大于100的值时,它从不打印错误信息,所以也许在输入sting的转换中存在一些问题,但我不明白在哪里! 这是代码:

.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

1 个答案:

答案 0 :(得分:2)

您的代码中存在许多问题:

该指令将导致32位比较(cmpl):

cmp   $10, car

因此,您需要使用cmpb指定要进行8位比较。

在您的计划的error部分,您忘记了int $0x80,因此无法打印任何内容。

您已获得jg error,但error:标签位于下一行,因此无论是否跳转,您都会在那里结束。该跳转应更改为jng exit