如何使用cmp来比较两个文字



我的目标是创建一个高/低游戏,在这个游戏中,我的计算机简单地计算最后两个可能的数字之间的一半。它会问:"我越来越暖和了吗?"我需要知道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, 0mov 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部分的其他地方写作。

相关内容

  • 没有找到相关文章

最新更新