我的目标是创建一个高/低游戏,我的计算机对最后两个可能的数字之间的一半进行简单的计算。它问:“我要变暖吗?”我需要做的事情(而且我不知道这是不是特定于nasm的东西)是cmp
指令为什么不起作用的知识。我已经尝试了几个答案,但它们不起作用。
我尝试使用
mov r8w, 'Y'
我也尝试过
mov r8w, 59h
两者都与字寄存器r8w
进行比较。我想知道我在代码中的什么地方跳过了逻辑。这是代码。
.loop:
mov rax, 1
mov rdi, 1
mov rsi, hot_cold
mov rdx, w_len
syscall
mov r9w, 0
mov rax, 0 ; setup for input
mov rbx, 0 ;
mov rdi, 2 ;
mov si, r9w ; collect input
syscall ; init collection
mov r8w, 0 ;
mov r8w, 'Y' ; 59h
cmp r9w, r8w ; compare to Y
jne .hop_no ; compare fail, try N
jmp _for_y ; compare success, change numbers
;syscall
jmp .loop ; loop on successful Y
.hop_no:
mov r8w, 0
mov r8w, 'N' ;4Eh
cmp r8w, r9w ; compare to N
jne _exit ; compare fail, exit
call _for_n ; compare success change numbers
;syscall
jmp .loop
两个literal?是否像1234
或'Y'
这样的汇编时间常数值?这通常是无用的,因为您可以自己找出结果,或者使用%if
让汇编器在汇编时执行结果。即优化了cmp,而不是编写设置和读取标志的说明。
但是,如果您坚持认为,cmp
最多可以采用一个立即数,所以mov
首先将另一个常数转入一个寄存器。
mov eax, 'Y'
cmp AL, 'Y'
这将设置标志:
(也写有PF和AF。]
re:您的实际代码试图将运行时变量I / O结果与整数常量'Y'
进行比较>
似乎您认为可以将read
个字节放入寄存器。不是这种情况。没有相当于getchar
的系统调用。 mov si, r9w
复制内容(不修改RSI的高6个字节),而不设置SI = R9W的地址。 注册人没有地址
读入缓冲区(例如在堆栈上),然后将其加载到寄存器中。 How to read input from STDIN in x86_64 assembly?或将cmp
与内存操作数一起使用。
使用strace ./my_program
查看您正在拨打的系统,以及返回的错误代码或成功的代码。
64位调用约定未在RBX中传递arg。我认为mov rbx, 0
是mov edx, 2
的错字。 (您似乎也混合了长度和FD参数。)您希望RDI = fd = 0,RDX = length = 2。 (或更多,以防用户键入更长的行)。
RSI需要指向read(int fd, void *buf, size_t len)
的内存。您已经从hot_cold
的地址中设置了RSI的高6字节,但是由于没有明显的原因,复制r9w
时将其低2字节设置为零。这可能使它返回-EFAULT
,或者您可能只是在.data
部分中的其他地方写。