根据我看过的一些教程,在组装中有很多方法可以做事。我在这里的一个标记是我是否可以做到这一点。我正在订购一本关于组装的书,但现在我需要知道我的高 - 低游戏出了什么问题。它的目的是找到用户选择的数字。除了我还没有真正做任何事情的事实之外,我还陷入了浮点异常。我使用的是 32 位寄存器,我决定尝试将它们移动到 64 位,但这根本没有帮助。我期待它运行,并继续运行,直到他们不在输入点按“Y”或“N”。现在,正如我所说,它提供了 FPEx 并在没有任何用户输入的情况下转储。
我试过 YouTube 上的教程和一些备忘单。但是他们只是没有能力将我限制在我的错误所在的区域。不过,我已经做到了。非常有帮助,但我现在需要得到一些 1:1。
global _start
section .data
message: db "High Lo", 10
m_len equ $-message
hot_cold: db "Am I getting warmer? (Y/N/Quit): "
w_len equ $-hot_cold
yes: db "Y"
no: db "N"
divide: dq 4.0
multiply: dq 2.0
section .bss
hilo: resq 1
NoHi: resq 1
NoLo: resq 1
newGuess: resq 1
yn: resd 1
section .text
_start:
mov rax, 1
mov rdi, 1
mov rsi, message
mov rdx, m_len
syscall
mov dword [NoHi], 50
mov dword [NoLo], 50
.loop:
mov rcx, [yes] ; char compare Y
mov rbx, [no] ; char compare N
xor rax, rax
xor rdi, rdi
xor rsi, rsi
xor rdx, rdx
syscall
mov rax, 1
mov rdi, 1
mov rsi, hot_cold
mov rdx, w_len
syscall
; xor rsi, rsi
xor rsp, rsp ; clear out register with y/n
xor rax, rax
xor rdx, rdx
xor rbp, rbp
mov rax, 0 ; setup for input
mov rbx, 0 ;
mov rsi, rsp ; collect input
mov rdx, 2 ; how many inputs
syscall ; init collection
.hop_yes:
cmp rcx, rsp ; compare to Y
jne .hop_no ; compare fail, try N
call _for_y ; compare success, change numbers
;syscall
jmp .loop ; loop on successful Y
.hop_no:
cmp rbx, rsp ; compare to N
jne _exit ; compare fail, rxit
call _for_n ; compare success change numbers
;syscall
jmp .loop
_for_y:
xor rax, rax
xor rdx, rdx
;xor rcx, rcx
mov rax, [NoHi]
mov rdx, [multiply]
mul rdx ; byte [multiply]
mov rdx, rax
syscall
;-----
xor rdi, rdi
;xor rdx, rdx
syscall
mov rax, 1
mov rdi, 1
mov rsi, rdx
;mov rdx, 3
syscall
;-----
xor rdx, rdx
mov rax, [NoLo]
mov rdx, [divide]
div rdx
mov rbp, rax
mov [NoLo], rbp
syscall
ret
_for_n:
xor rdx, rdx
mov rax, [NoLo]
mov rdx, [divide]
div rdx
mov [NoLo], rax
;-----
xor rax, rax
mov rax, [NoHi]
mov rdx, [multiply]
mul rdx
mov [NoLo], rax
syscall
ret