我的目标是创建一个高/低游戏,在这个游戏中,我的计算机简单地计算最后两个可能的数字之间的一半。它会问:"我越来越暖和了吗?"我需要知道cmp
指令为什么不起作用(我不知道这是nasm特有的还是什么(。我试过几个答案,但都不起作用。
我试过使用
mov r8w, 'Y'
我也试过
mov r8w, 59h
两者都与字寄存器CCD_ 4进行比较。我想知道我在代码中跳过逻辑的地方。这是代码。
.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
两个文字?像1234
或'Y'
这样的汇编时间常数值?这通常是无用的,因为你可以自己计算结果,或者使用%if
让汇编程序在汇编时完成。即优化掉cmp,而不是写入设置和读取FLAGS的指令。
但如果你坚持,cmp
最多可以取一个立即数,所以mov
先将另一个常量立即数加到寄存器中。
mov eax, 'Y'
cmp AL, 'Y'
这会设置标志:
- ZF=1,因为"Y"-"Y"=0
- CF=OF=0,因为没有借位,也没有符号溢出
- SF=0
(同时写入PF和AF。(
re:尝试将运行时变量I/O结果与整数文字常量'Y'
进行比较的实际代码
看起来您认为可以将read
字节放入寄存器中。事实并非如此。没有等效于getchar
的系统调用。mov si, r9w
复制内容(不修改RSI的高6字节(,而不设置SI=R9W的地址寄存器没有地址。
读取缓冲区(例如堆栈上(,然后将其加载到寄存器中。如何在x86_64程序集中读取STDIN的输入?或者将cmp
与内存操作数一起使用。
使用strace ./my_program
查看您正在进行的系统调用以及它们返回的错误代码或成功。
64位调用约定在RBX中不传递参数。我认为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
部分的其他地方写作。