GAS 到 NASM 程序集:将".rept .set"转换为 NAM(循环并将递增值分配给标签)



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的操作数是一个关键表达式,要重复多行代码或复杂的宏,使用预处理器%rep指令,看看这个愚蠢的例子:

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 $?

最新更新