我需要近跳(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:
答案 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