【发布时间】:2021-03-29 00:50:07
【问题描述】:
我需要在程序集中重新定义/删除一个变量,所以它可以重新定义 我正在使用裸机,所以我不能使用 windows/linux 操作系统调用。
我的代码:
; Print String code
; Invoke with CALL PRINTS, otherwise it jump to a random command
prints:
mov ax, 0x07c0
mov ds, ax
mov si, msg
cld
jmp .loop
.loop:lodsb
or al, al ; zero=end or str
jz .done ; get out
mov ah, 0x0E
mov bh, 0
int 0x10
jmp .loop
.done:
popa
pop msg
ret
msg db 'AHHHHHHHHHHHHHHHHHHHHHHHHH', 0
【问题讨论】:
-
您不能“销毁”静态变量。但如果你愿意,你可以用一些其他数据覆盖那个空间。
-
pop msg甚至无法编码;目的地不能是即时的。pop [msg]可能但没有用(从堆栈复制到db的前 2 个字节。当然,堆栈也因运行popa而在函数开始时没有任何东西推送东西而搞砸了首先在堆栈上。但这似乎是与您所询问的事情不同的错误。如果您需要未初始化的暂存空间,您可以在完成后释放。 -
如果你的意思是
msg这个名字和你想叫msg的其他东西冲突,那就很难了;组成独特的名称。 (或者使用.msg:得到一个像prints.msg这样的全名。) -
@NateEldredge 你的意思是像
mov [msg], 0吗? -
如果您希望您的打印函数可重用,请将指针 arg 传递给它,而不是让它打印静态缓冲区。您的
msg: db ...与 C 中的static char msg[] = "...";完全相同。如果这不是您想要的,请不要这样做。
标签: assembly nasm bare-metal