assembly 程序集跳转指令中的f和B符号[重复]

rslzwgfq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(157)

此问题在此处已有答案

What does 1: mean in assembly language?(1个答案)
1b and 1f in GNU assembly(2个答案)
上个月关门了。
问题是写汇编程序来计算n!. n在rdi中,结果应该在rdx:rax中.如果结果不能写在rdx:rax中,则应该返回适合rdx:rax的最大数.下面的链接是正确答案.我只有一个小问题:为什么在第3行使用“ja 3f”而不是简单的“ja 3”,为什么在第17行使用“ja 1b”?这里的“f”和“b”是什么意思?

factorial:
    cmp rdi, 34
    ja 3f
    xor edx, edx // Result stored in rdx:rax
    mov eax, 1
    cmp edi, 1
    jbe 2f    
1:  // Compute rdx:rax = rdx:rax * rdi
    // New rdx: rdx*rdi + (rax*rdi >> 64)
    // New rax: rax*rdi
    mov rcx, rdi
    imul rcx, rdx // First part of new rdx
    mul rdi // New rax + second part of new rdx
    sub edi, 1
    add rdx, rcx // New rdx
    cmp edi, 1

    ja 1b // Break loop if edi <= 1
2:  ret

3:  mov rax, -1
    mov rdx, -1
    ret
xhv8bpkk

xhv8bpkk1#

1:2:等是GNU汇编器语法中的“本地标签”,fb告诉汇编器去哪里查找这些标签。
在源文件中,可以有许多标签的名称是相同的一位数。3f表示当前行之后的下一个标签3:3b表示其之前最近的标签。
这样的标签非常有用,因为如果你只想向前或向后移动几行,你不必每次都想一个唯一的名字,而且代码适合复制+粘贴到其他文件中,而不必考虑哪些名字可能已经被使用了。如果你想走得更远,你可能应该想一个有意义的名字,使它更容易阅读。
请参阅GNU as手册以了解更多详细信息。

相关问题