程序集8086-从键盘读取一个值,并将其与另一个值进行比较



我写了一个程序,要求插入一个值:如果值小于或等于100,程序将无错误退出;否则它将打印一条错误消息并退出。不幸的是,当我插入一个大于100的值时,它永远不会打印错误消息,所以在转换输入字符串时可能会出现一些问题,但我不知道在哪里!这是代码:

.section .data
 str:
    .ascii "Insert value:n"
 str_len:
    .long . - str   
 err:
    .ascii "Errorn"
 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

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

此指令将产生32位比较(cmpl):

cmp   $10, car

因此,您需要使用cmpb指定您想要一个8位比较。


在程序的error部分中,您忘记了int $0x80,因此它不会打印任何内容。


你有一个jg error,但error:标签就在下一行,所以无论是否跳转,你都会到达那里。该跳转应更改为jng exit

相关内容

最新更新