如何使用cmp比较两个文字

问题描述 投票:0回答:1

我的目标是创建一个高/低游戏,我的计算机对最后两个可能的数字之间的一半进行简单的计算。它问:“我要变暖吗?”我需要做的事情(而且我不知道这是不是特定于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
assembly x86-64 nasm
1个回答
1
投票

两个literal?是否像1234'Y'这样的汇编时间常数值?这通常是无用的,因为您可以自己找出结果,或者使用%if让汇编器在汇编时执行结果。即优化了cmp,而不是编写设置和读取标志的说明。

但是,如果您坚持认为,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的地址。 注册人没有地址

读入缓冲区(例如在堆栈上),然后将其加载到寄存器中。 How to read input from STDIN in x86_64 assembly?或将cmp与内存操作数一起使用。

使用strace ./my_program查看您正在拨打的系统,以及返回的错误代码或成功的代码。

64位调用约定未在RBX中传递arg。我认为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部分中的其他地方写。

© www.soinside.com 2019 - 2024. All rights reserved.