assembly - x86-64组装测试-JLE

标签 assembly x86 branch

这个:

testl   %esi, %esi
jle .L3
movl    %esi, %eax


如果testlesi进行逻辑“与”运算,则结果永远不能小于,而只能等于,如果esi为0。则无法达到movl。没错,或者我缺少一些东西。

第二步:

f1:
    pushq   %rbp
    movq    %rsp, %rbp
    testl   %esi, %esi
    jle .L3
    movl    %esi, %eax
.L2:
    incb    (%rdi)
    incq    %rdi
    decq    %rax
    jne .L2
.L3:
    popq    %rbp
    ret


在假设的C转换中,如果.L3pop组成,则ret并且发生分支,可以确定函数返回的值吗?

最佳答案

“小于或等于”定义为:ZF=1 or SF != OF

TEST指令根据操作数之间的逻辑ZF设置SFAND,并清除OF

因此,实际上,您最终遇到条件ZF or SF,意思是“小于或等于零”(即,在这种情况下,如果使用(signed int)esi <= 0,则将进行跳转)。

编辑:对于您的问题的第二部分,它看起来像在做这些事情:

void f1(char *c, int len)
{
    if (len > 0) {
        for (i = len; i != 0; i--) {
            (*c)++;
            c++;   
        }
    }
} 

关于assembly - x86-64组装测试-JLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17411048/

相关文章:

c - _malloc 在汇编中到底做了什么?

git - 如何从 Github pull 特定分支

c - printf 并且在汇编代码中不显示

string - 在 8086 汇编中对字符串进行排序

assembly - 汇编语言中 "ds:"的含义

x86 - 将 x86 驱动程序代码放在环 1 和 2 而不是 0 中是否有优势?

c - 这个机器代码在 C 中看起来像什么?

c - 不使用 ebp 实现堆栈回溯

git - git branch -m 对其他开发人员有副作用吗?

git - 使用 Git 将更改从 master merge 到所有分支?