0

根据我看过的一些教程,在组装中有很多方法可以做事。我在这里的一个标记是我是否可以做到这一点。我正在订购一本关于组装的书,但现在我需要知道我的高 - 低游戏出了什么问题。它的目的是找到用户选择的数字。除了我还没有真正做任何事情的事实之外,我还陷入了浮点异常。我使用的是 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
4

0 回答 0