我的程序不会跳过JG条件下的命令,C/C++汇编

fiei3ece  于 2023-03-20  发布在  C/C++
关注(0)|答案(2)|浏览(170)

我是一个初学者(UNI的第一年)。我使用VisualStudio和x86配置。这是我的功能:

int hex(int x) {
    __asm {
        MOV EAX, x
        CMP EAX, 9
        JG jumpto
        ADD EAX, 48
        MOV x, EAX
        jumpto: 
        ADD EAX, 55
        MOV x, EAX
        }
    return x;
}

JG条件有问题,或者我没有正确理解。我对CMP和JG行的理解是:
1.将EAX与9进行比较(x与9)。
1.如果它大于9,它将跳转到“jumpto”(哇,这听起来很愚蠢)。
1.如果它不是更大,它只是读取JG和jumpto之间的线。所以我基本上认为它的工作原理类似于if/else
我的问题是,如果它不是更大,程序仍然读取在“跳转到”段中的行(ADDEAX,55 ;MOV x,EAX),据我所知,这是不应该的。
有没有人能给我解释一下(就像我是个孩子或者尽可能简单)为什么它不起作用。我是希望之星。谢谢。
我又试了一次谷歌,如果我没有犯错误的话,它只是让我对如果/否则的事情更有信心。

qco9c6ql

qco9c6ql1#

正如@ChrisMM在评论中指出的,你所拥有的大致相当于:

if (x<=9) {
   x += 48;
}
x += 55;

......而你大概想要的东西更像是:

if (x<=9) {
    x += 48;
} else {
    x += 55;
}

正如他所指出的,你可以通过在你现在拥有的jumpto标签之前添加一个无条件跳转来得到这个,所以添加48和添加55是相互排斥的。
另一种更有效的可能性是类似于下面这样的:

if (x > 9) {
    x += (55-48);
}
x += 48;

这将变成如下所示:

cmp eax, 9
jle  jumpto
add eax, (55-48)
jumpto:
add eax, 48
mov x, eax
2skhul33

2skhul332#

所以我基本上认为它就像if/else
这是正确的,但是即使是高级语言也会在else之前有某种跳转,所以执行可以在endif继续:

if expression
  action1
  ; Here is a hidden jump
else
  action2
endif

现在在汇编中你必须自己编写跳转:

MOV EAX, x
    CMP EAX, 9
    JG  jumpto
    ADD EAX, 48
    jmp TheEndif
jumpto: 
    ADD EAX, 55
TheEndif:
    MOV x, EAX

更简单的方法:

mov  eax, x
    cmp  eax, 9
    jbe  TheEndif
    add  eax, 7
TheEndif:
    add  eax, 48
    mov  x, eax

相关问题