近跳转自动变为短跳

时间:2017-10-08 10:49:47

标签: assembly dos masm tasm short

我需要近跳(E9 XX XX)并在代码中指定,但TASM(和MASM)在汇编后将其更改为Short(EB XX NOP)。

MAIN SEGMENT BYTE

ASSUME CS:MAIN,DS:MAIN,SS:NOTHING

ORG 100H


HOST:

jmp NEAR PTR VIRUS_START 

db ’VI’

mov ah,4CH

mov al,0

int 21H ;terminate normally with DOS

COMFILE DB ’*.COM’,0 ;search string for a com file
VIRUS_START:

3 个答案:

答案 0 :(得分:3)

一种简单的方法来强制使用 near 跳转而不是 short 跳转,这是有足够的字节跳过来的!

  • 使用一些填充:

    COMFILE DB ’*.COM’,0 ;search string for a com file
    padding db 127 dup (0)
    VIRUS_START:
    
  • 或者在标签 VIRUS_START

  • 之前添加一些有用的子程序

另一种可能性是手动编码跳转 只需写下db 0E9h, 14, 0

即可

答案 1 :(得分:2)

您可以通过手动编码jmp near rel16来解决汇编程序:

db  0E9h                    ;  JMP NEAR opcode
dw  VIRUS_START-$-2         ;  relative address

$是当前指令(dw)的绝对地址。
($ + 2)下一条指令的地址(在我们的jmp之后)。

(VIRUS_START-($ + 2))-目标地址(VIRUS_START)与下一条指令之间的差。将在执行JMP指令时将其添加到IP寄存器中。

答案 2 :(得分:1)

我不知道MASM或TASM的答案,但也许这对某人有用:

在NASM中,jmp near VIRUS_START会强制执行长编码。您还可以使用add dx, strict word 1之类的东西强制使用imm16编码而不是imm8编码。见http://www.nasm.us/doc/nasmdoc3.html#section-3.7

; ASSUME: I think there's a way to port that to NASM, but IDK how.
ORG 100H

HOST:
jmp NEAR VIRUS_START   ; with override
jmp VIRUS_START        ; without
... ; your code unmodified
VIRUS_START:

nasm -fbin foo.asm汇总。然后看看我们用ndisasm -o 0x100 foo得到了什么(它只知道平面二进制文件):

00000100  E91000            jmp 0x113
00000103  EB0E              jmp short 0x113