使用 jmp(dos assembly) 模拟调用的最佳方法

Best way to simulate a call with jmp(dos assembly)

我在 windows 上使用平面汇编器并且已经用 jmp 模拟了一个调用指令,但想知道是否有更好的方法用更少的代码来完成它?(不使用调用)

这是代码。

org 100h

mov al, 'x'

push come_back ; - simulated "call" -
jmp test_label  ; -   continued  -
come_back:     ; - end of simulated "call" -


mov al, 'y'

push come_back2 ; - simulated "call" -
jmp test_label  ; -   continued  -
come_back2:     ; - end of simulated "call" -

Looop:
jmp Looop


test_label:
mov ah, 0x0e
int 0x10
pop cx   ; - simulated "ret" -
jmp cx   ; - end of simulated "ret" 

此代码仅向控制台显示 "xy",两个字符。

我不想打电话,因为我不想更好地理解,有时这涉及以错误的方式做事。 我是组装新手,不知道最好的方法是什么。

这可能有效:

push $+5
jmp fn
; no label needed here

有些汇编器会将$解释为指令地址。

这是一个无限循环:

jmp $

您的处理方式与处理器内部处理方式相同。不过,您应该使用 callret 来完成。每条指令都需要时间来执行。这称为循环。您拥有的指令越多,所需的周期就越多,因此执行的时间也就越长。

在内部,当处理器到达代码中的 call 指令时,会发生这种情况:

  1. 处理器在您的调用语句之后将 IP 寄存器的地址压入堆栈。
  2. 处理器将 IP 寄存器的地址更改为您调用操作码的地址。
  3. 执行恢复。

当处理器处理到您代码中的 ret 指令时,会发生这种情况:

  1. 处理器从堆栈弹出 16 位地址并将其放入 IP 寄存器。
  2. 执行恢复

虽然看起来步骤很多,但这些步骤不会耗尽周期,因为它内置于 CPU 的硬件中。