使用jmp(dos程序集)模拟调用的最佳方法

时间:2015-01-25 04:44:13

标签: assembly dos fasm

我在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”,两个字符到控制台。

我不想使用电话,因为我不是一个更好的理解,有时这涉及做错事。 我是装配新手,不知道最好的方法是什么。

2 个答案:

答案 0 :(得分:2)

您正在以与处理器内部相同的方式执行此操作。您应该使用callret来执行此操作。每条指令都需要时间来执行。这称为循环。您拥有的指令越多,所需的周期就越多,从而需要更多的时间来执行。

在内部,当处理器在代码中出现call指令时,会发生以下情况:

  1. 处理器将您的调用语句后的IP寄存器的地址压入堆栈。
  2. 处理器将IP寄存器的地址更改为您的呼叫操作码的地址。
  3. 执行恢复。
  4. 当处理器在代码中出现ret指令时,会发生以下情况:

    1. 处理器从堆栈中弹出16位地址并将其放入IP寄存器。
    2. 执行恢复
    3. 虽然看似很多步骤,但这些步骤不会占用周期,因为它内置于CPU的硬件中。

答案 1 :(得分:1)

这可能有效:

push $+5
jmp fn
; no label needed here

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

这是一个无限循环:

jmp $