提前感谢您的任何帮助。这个问题快把我逼疯了。所以我有一个小计算器应用程序,要求用户的名字,要求2个数字,问他们是否要添加/Sub/穆尔/Div,打印出答案,然后问他们是否要再做一次。好吧,一切都很完美,直到我问他们是否想再做一次。当我们到达这一点时,系统会打印问题,但不会等待响应。所有用户输入的代码都是一样的,所以我对问题是什么感到非常困惑。我已经包含了下面的代码,并强调了问题所在的函数。你会看到,还有其他人是相当完全相同的,他们没有任何问题。不管怎样,就是这样。
; "Hello World!" in 64 bit Linux NASM
global _start ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
nop
mov rax, 4 ; sys_write syscall
mov rbx, 1 ; std_out
mov rcx, inputMsg ; message address
mov rdx, input_L ; message string length
int 80h
; grab user input
mov rax, 3 ; sys_read syscall
mov rbx, 0 ; std_in
mov rcx, userIn ; output to username
mov rdx, 16 ; accept 16 bytes
int 80h
; say hello
mov rax, 4 ; sys_write
mov rbx, 1 ; std_out
mov rcx, helloMsg
mov rdx, helloMsg_L
int 80h
; print users name
mov rax, 4
mov rbx, 1
mov rcx, userIn
mov rdx, 16
int 80h
_calc:
; ask for first number
mov rax, 4
mov rbx, 1
mov rcx, numMsg1
mov rdx, numMsg1_L
int 80h
; grab first number
mov rax, 3
mov rbx, 2
mov rcx, num1
mov rdx, 8
int 80h
; ask user for second number
mov rax, 4
mov rbx, 1
mov rcx, numMsg2
mov rdx, numMsg2_L
int 80h
; grab second number
mov rax, 3
mov rbx, 2
mov rcx, num2
mov rdx, 8
int 80h
; ask user what function they want to do 1=add, 2=sub, 3=mul, 4=div
mov rax, 4
mov rbx, 1
mov rcx, function
mov rdx, function_L
int 80h
; get what function user wants to do
mov rax, 3
mov rbx, 2
mov rcx, func
mov rdx, 1
int 80h
; go to appropriate label
mov rax, [func]
sub rax, '0'
cmp rax, 1
je _add
cmp rax, 2
je _sub
cmp rax, 3
je _mul
cmp rax, 4
je _div
_sum:
; display sum
mov rax, 4 ; sys_write
mov rbx, 1 ; std_out
mov rcx, sum
mov rdx, 16
int 80h
; ask user if they want to enter more numbers
mov rax, 4
mov rbx, 1
mov rcx, inMsg2
mov rdx, inMsg2_L
int 80h
;get answer
mov rax, 3
mov rbx, 2
mov rcx, response
mov rdx, 1
int 80h
mov rax, [response]
sub rax, '0'
cmp rax, 1
je _calc
jmp _end
_add:
; add numbers
mov rax, [num1] ; move first number into rax
sub rax, '0' ; sub '0' to convert ascii to decimal
mov rbx, [num2] ; move second number into rbx
sub rbx, '0' ; sub ascii '0' to convert to decimal
add rax, rbx ; add rbx to rax
add rax, '0' ; add ascii '0' to convert to ascii
mov [sum], rax ; move the sum to a temp variable
jmp _sum
_sub:
; subtract numbers
mov rax, [num1] ; move first number into rax
sub rax, '0' ; sub '0' to convert ascii to decimal
mov rbx, [num2] ; move second number into rbx
sub rbx, '0' ; sub ascii '0' to convert to decimal
sub rax, rbx ; add rbx to rax
add rax, '0' ; add ascii '0' to convert to ascii
mov [sum], rax ; move the sum to a temp variable
jmp _sum
_mul:
; multiply numbers
mov rax, [num1] ; move first number into rax
sub rax, '0' ; sub '0' to convert ascii to decimal
mov rbx, [num2] ; move second number into rbx
sub rbx, '0' ; sub ascii '0' to convert to decimal
imul rax, rbx ; multiply rbx to rax
add rax, '0' ; add ascii '0' to convert to ascii
mov [sum], rax ; move the sum to a temp variable
jmp _sum
_div:
; devide numbers
mov rax, [num1] ; move first number into rax
sub rax, '0' ; sub '0' to convert ascii to decimal
mov rbx, [num2] ; move second number into rbx
sub rbx, '0' ; sub ascii '0' to convert to decimal
idiv rbx ; divide rbx to rax
add rax, '0' ; add ascii '0' to convert to ascii
mov [sum], rax ; move the sum to a temp variable
jmp _sum
_end:
; sys_exit(return_code)
mov rax, 1 ; sys_exit syscall
mov rbx, 0 ; return 0 (success)
int 80h
section .data
helloMsg: db 'Hello, ' ; message and newline
helloMsg_L: equ $-helloMsg ;
inputMsg: db 'Enter your name: ' ; message telling user to input name
input_L: equ $-inputMsg
numMsg1: db 'Enter number 1: ' ; message telling user to inpt first number
numMsg1_L: equ $-numMsg1
numMsg2: db 'Enter number 2: ' ; message telling user to input second number
numMsg2_L: equ $-numMsg2
function: db 'Select function: ADD(1), SUB(2), MUL(3), DIV(4) '
function_L: equ $-function
inMsg2: db 'Run again? YES(1), NO(0) '
inMsg2_L: equ $-inMsg2
sumMsg: db 'The sum is: '
sumMsg_L: equ $-sumMsg
section .bss
userIn: resb 16
num1: resb 8
num2: resb 8
sum: resb 16
func: resb 2
response: resb 2
所以粗体部分是问题所在,至少我认为是。基本上它只是跳过了这个,或者看起来像是跳过了它。前面的函数显示问题,但不等待响应,因为我们不能输入任何内容,所以它就结束了。
再次感谢你的帮助
布拉德
哦,我希望这是我刚刚忽略的一些非常愚蠢的事情。我可以处理愚蠢的LOL,我只是希望这能起作用。
编辑:当我用GDB调试这个时,没有问题,所以不幸的是调试没有帮助。
编辑2:刚刚意识到它实际上并没有加粗那一节,而是把**放在前面和后面。我想为了简化,对于那些不想阅读所有代码的人来说,这是函数或系统调用,似乎不能正常工作。
; ask user if they want to enter more numbers
mov rax, 4
mov rbx, 1
mov rcx, inMsg2
mov rdx, inMsg2_L
int 80h
;get answer
mov rax, 3
mov rbx, 2
mov rcx, response
mov rdx, 1
int 80h
mov rax, [response]
sub rax, '0'
cmp rax, 1
je _calc
jmp _end
还有这个,它能用
; ask user what function they want to do 1=add, 2=sub, 3=mul, 4=div
mov rax, 4
mov rbx, 1
mov rcx, function
mov rdx, function_L
int 80h
; get what function user wants to do
mov rax, 3
mov rbx, 2
mov rcx, func
mov rdx, 1
int 80h
; go to appropriate label
mov rax, [func]
sub rax, '0'
cmp rax, 1
je _add
cmp rax, 2
je _sub
cmp rax, 3
je _mul
cmp rax, 4
je _div
所以,再次,为什么一个工作,另一个不逃避我在这一点上,我已经调试了代码,不幸的是,这并没有真正给我任何现场到什么问题。
编辑3:
这就是我运行它时得到的结果。
h**p@h**p-VirtualBox:~/Programming$ ./helloInput64
Enter your name: brad
Hello, brad
Enter number 1: 2
Enter number 2: 3
Select function: ADD(1), SUB(2), MUL(3), DIV(4) 1
The sum is: 5Run again? YES(1), NO(0) h**p@h**p-VirtualBox:~/Programming$
所以在它打印出总和之后,它就完全变傻了。在同一行上打印下一个字符串,并在不抓取用户输入的情况下结束。
1条答案
按热度按时间zd287kbt1#
谢谢迈克尔·佩奇让我走上正轨。你最后的评论,建议机会
mov rdx, 1
到mov rdx, 2
让我走上了正确的道路。不得不做一些更多的小调整,但它现在的功能,因为我会期望。因为我读了2个字节,其中一个是一个换行(再次感谢迈克尔),我然后只是对AL的cmp,这似乎做的伎俩。再次感谢。