【问题标题】:Destroy variable(s) in NASM x86 assembly销毁 NASM x86 程序集中的变量
【发布时间】: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


【解决方案1】:

我认为没有(好的)方法可以做到这一点,所以我会让他们选择要打印的 VAR 名称,如果有冲突,我会让 NASM 向他们发出警告。

【讨论】:

  • 您不需要为每个单独的字符串使用单独的打印功能。编写一个接受指针 arg 的函数,而不是将其设为宏或其他东西。或者这就是“让他们选择”的意思?这样做的机制是关键点。如果你的函数只接受一个指针(例如在 DS:SI 中),那么你的函数根本不必担心符号名称,所以 IDK 你为什么要提到它。
猜你喜欢
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多