我写了一个程序,要求插入一个值:如果该值小于或等于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
答案 0 :(得分:2)
您的代码中存在许多问题:
该指令将导致32位比较(cmpl
):
cmp $10, car
因此,您需要使用cmpb
指定要进行8位比较。
在您的计划的error
部分,您忘记了int $0x80
,因此无法打印任何内容。
您已获得jg error
,但error:
标签位于下一行,因此无论是否跳转,您都会在那里结束。该跳转应更改为jng exit
。