【发布时间】:2021-06-03 02:03:06
【问题描述】:
我是学习汇编 x86 的新手。我编写了一个程序,要求用户输入一个数字,然后检查它是偶数还是奇数,然后打印一条消息以显示此信息。 该代码工作正常,但有一个问题。它仅适用于 1 位数字:
; Ask the user to enter a number from the keyboard
; Check if this number is odd or even and display a message to say this
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
;Display 'Please enter a number'
mov eax, 4 ; sys_write
mov ebx, 1 ; file descriptor: stdout
mov ecx, msg1 ; message to be print
mov edx, len1 ; message length
int 80h ; perform system call
;Enter the number from the keyboard
mov eax, 3 ; sys_read
mov ebx, 2 ; file descriptor: stdin
mov ecx, myvariable ; destination (memory address)
mov edx, 4 ; size of the the memory location in bytes
int 80h ; perform system call
;Convert the variable to a number and check if even or odd
mov eax, [myvariable]
sub eax, '0' ;eax now has the number value
and eax, 01H
jz isEven
;Display 'The entered number is odd'
mov eax, 4 ; sys_write
mov ebx, 1 ; file descriptor: stdout
mov ecx, msg2 ; message to be print
mov edx, len2 ; message length
int 80h
jmp outProg
isEven:
;Display 'The entered number is even'
mov eax, 4 ; sys_write
mov ebx, 1 ; file descriptor: stdout
mov ecx, msg3 ; message to be print
mov edx, len3 ; message length
int 80h
outProg:
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg1 db "Please enter a number: ", 0xA,0xD
len1 equ $- msg1
msg2 db "The entered number is odd", 0xA,0xD
len2 equ $- msg2
msg3 db "The entered number is even", 0xA,0xD
len3 equ $- msg3
segment .bss
myvariable resb 4
对于超过 1 位的数字,它不能正常工作,因为它只考虑输入数字的第一个字节(第一个数字),所以它只检查那个。所以我需要一种方法来找出用户输入的值中有多少位(字节),这样我就可以做这样的事情: ;将变量转换为数字并检查是偶数还是奇数
mov eax, [myvariable+(number_of_digits-1)]
并且只检查包含最后一位数字的 eax 以查看它是偶数还是奇数。 问题是我不知道如何在用户输入号码后检查我的号码中有多少字节。 我确信这很容易,但我无法弄清楚,也没有找到任何关于如何在谷歌上做到这一点的解决方案。请帮我解决一下这个。谢谢!
【问题讨论】:
-
实际上,对于这个玩具示例,您只需要最后一位即可知道整个值是奇数还是偶数。
-
注意stdin是0。2是stderr。 (它恰好可以工作,因为终端仿真器通常使用所有 3 个文件描述符来运行 shell,这些文件描述符引用 tty 的相同读写打开文件 description)。
标签: linux assembly x86 system-calls