我想看看是否可以在汇编中进行自修改代码,因为.text
它是只读的,我想我可以将代码放入.data
,我尝试了下面的代码。
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov al,3
mov rbx,cont1 ;store label cont1 in rbx so we can continue there
mov cl,byte [dec_op] ;put the opcode of the dec instruction in cl
mov byte [code],cl ;replace the inc instruction with a dec instruction
jmp code ;run the modified code
cont1:
mov byte [dat1],al ;store away the changed value
add byte [dat1],0x30 ;turn the internal numeric value into an ascii digit
mov eax,4 ;system call number (sys_write)
mov ebx,1 ;stdout
mov ecx,dat1 ;location of data
mov edx,2 ;length of data
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
dat1 db 0,0xa ;location to store output
dec_op dec al ;the dec instruction
code inc al ;code to modify
jmp rbx
上面的输出是
4
虽然我期望2
,因为在修改自身之后,它应该有一个减少指令而不是一个增加指令。我究竟做错了什么?
我正在运行 debian sid 64 位,并且正在编译:
nasm -f elf64 sm.s
ld -s -o sm sm.o