使用 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 $
您的处理方式与处理器内部处理方式相同。不过,您应该使用 call
和 ret
来完成。每条指令都需要时间来执行。这称为循环。您拥有的指令越多,所需的周期就越多,因此执行的时间也就越长。
在内部,当处理器到达代码中的 call
指令时,会发生这种情况:
- 处理器在您的调用语句之后将
IP
寄存器的地址压入堆栈。
- 处理器将
IP
寄存器的地址更改为您调用操作码的地址。
- 执行恢复。
当处理器处理到您代码中的 ret
指令时,会发生这种情况:
- 处理器从堆栈弹出 16 位地址并将其放入
IP
寄存器。
- 执行恢复
虽然看起来步骤很多,但这些步骤不会耗尽周期,因为它内置于 CPU 的硬件中。
我在 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 $
您的处理方式与处理器内部处理方式相同。不过,您应该使用 call
和 ret
来完成。每条指令都需要时间来执行。这称为循环。您拥有的指令越多,所需的周期就越多,因此执行的时间也就越长。
在内部,当处理器到达代码中的 call
指令时,会发生这种情况:
- 处理器在您的调用语句之后将
IP
寄存器的地址压入堆栈。 - 处理器将
IP
寄存器的地址更改为您调用操作码的地址。 - 执行恢复。
当处理器处理到您代码中的 ret
指令时,会发生这种情况:
- 处理器从堆栈弹出 16 位地址并将其放入
IP
寄存器。 - 执行恢复
虽然看起来步骤很多,但这些步骤不会耗尽周期,因为它内置于 CPU 的硬件中。