我写了一个程序,要求插入一个值:如果值小于或等于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
。