问题描述
GAS 程序集知道 .set
指令,它可以与 .rept
组合以在循环中递增标签(变量),如下例所示:
pd:
.set SPAGE,0
.rept 512
.quad SPAGE + 0x87 // PRESENT,R/W,USER,2MB
.set SPAGE,SPAGE + 0x200000
.endr
如何在 NASM 中实现类似的方便?我知道 TIMES
指令,但这并不能帮助我实现我想要的。有任何想法吗?来自 NASM 的 EQU
指令只允许赋值一次。因此,它不能解决我的问题。
解决方法
实际上这是不可能用times指令做的,因为TIMES
的操作数是一个critical expression,要重复多行代码或复杂的宏,使用预处理器{{3 }} 指令,看看这个愚蠢的例子:
global _start
section .text
_start:
mov rbx,0
%assign i 0
%rep 5
mov rbx,[variable]
add rbx,i
mov [variable],rbx
%assign i i+1
%endrep
mov rax,60 ; system call for exit
mov rdi,[variable]; value of 'variable' = 10
syscall
section .bss
variable: resb 1
检查答案:
nasm -felf64 ass.asm && ld ass.o && ./a.out
echo $?