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