我在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”,两个字符到控制台。
我不想使用电话,因为我不是一个更好的理解,有时这涉及做错事。 我是装配新手,不知道最好的方法是什么。
答案 0 :(得分:2)
您正在以与处理器内部相同的方式执行此操作。您应该使用call
和ret
来执行此操作。每条指令都需要时间来执行。这称为循环。您拥有的指令越多,所需的周期就越多,从而需要更多的时间来执行。
在内部,当处理器在代码中出现call
指令时,会发生以下情况:
IP
寄存器的地址压入堆栈。IP
寄存器的地址更改为您的呼叫操作码的地址。当处理器在代码中出现ret
指令时,会发生以下情况:
IP
寄存器。虽然看似很多步骤,但这些步骤不会占用周期,因为它内置于CPU的硬件中。
答案 1 :(得分:1)
这可能有效:
push $+5
jmp fn
; no label needed here
有些汇编程序会将$
解释为指令地址。
这是一个无限循环:
jmp $