将输入与汇编中的字符进行比较时出错
Error when comparing input to character in assembly
我正在尝试接受字符 f 或 c 的输入。然后根据打印出一条消息,然而,当我尝试比较我存储在变量中的值与输入值 (conv) 时,它没有产生预期的结果,我也不知道为什么。我将在下面附上该特定部分的代码并解释输出。
;Read and store the user input
mov eax, 3
mov ebx, 0
mov ecx, conv
mov edx, 4
int 0x80
;Output the letter entered
mov eax, 4
mov ebx, 1
mov ecx, conv
mov edx, 4
int 80h
cmp ecx,66h ;comparing with ascii char that has hex val 66h i.e 'f'
je toFarenheit
toCelcius:
;display test message for C
mov edx, lenTestC ;message length
mov ecx, testMsgC ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
jmp exit
toFarenheit:
;display test message for F
mov edx, lenTestF ;message length
mov ecx, testMsgF ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
exit:
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .bss
res resb 4
conv resb 4
尽管 ecx 中的输入是 f 并且它正在与 66h 进行比较(也是 f),但对于 je 语句,它的计算结果不为真,因此不会跳转到华氏度,因此 toCelcius 块运行,然后程序跳转退出然后结束
ecx
或低字节 cl
中的值不对应任何 ASCII 代码点。 ecx
中的值用于将指向内存的指针传递给系统调用。因此,可以在 conv
缓冲区的第一个字节中找到 ASCII 码。此外,您不必自己将字母转换为数字代码,NASM 允许在单引号中指定字母以自动插入数字代码。因此,您的比较应该如下:
cmp byte [conv], 'f'
我正在尝试接受字符 f 或 c 的输入。然后根据打印出一条消息,然而,当我尝试比较我存储在变量中的值与输入值 (conv) 时,它没有产生预期的结果,我也不知道为什么。我将在下面附上该特定部分的代码并解释输出。
;Read and store the user input
mov eax, 3
mov ebx, 0
mov ecx, conv
mov edx, 4
int 0x80
;Output the letter entered
mov eax, 4
mov ebx, 1
mov ecx, conv
mov edx, 4
int 80h
cmp ecx,66h ;comparing with ascii char that has hex val 66h i.e 'f'
je toFarenheit
toCelcius:
;display test message for C
mov edx, lenTestC ;message length
mov ecx, testMsgC ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
jmp exit
toFarenheit:
;display test message for F
mov edx, lenTestF ;message length
mov ecx, testMsgF ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
exit:
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .bss
res resb 4
conv resb 4
尽管 ecx 中的输入是 f 并且它正在与 66h 进行比较(也是 f),但对于 je 语句,它的计算结果不为真,因此不会跳转到华氏度,因此 toCelcius 块运行,然后程序跳转退出然后结束
ecx
或低字节 cl
中的值不对应任何 ASCII 代码点。 ecx
中的值用于将指向内存的指针传递给系统调用。因此,可以在 conv
缓冲区的第一个字节中找到 ASCII 码。此外,您不必自己将字母转换为数字代码,NASM 允许在单引号中指定字母以自动插入数字代码。因此,您的比较应该如下:
cmp byte [conv], 'f'