这个问题是不是关于LEA指令,不是关于它是如何工作的,它不是重复的。这是关于OPCODE代这个指令。LEA指令操作码生成
LEA操作码中的操作数是多少?
这里是我的 “你好world.fasm”:
汇编程序:
format ELF64 executable at 0000000100000000h ; put image over 32-bit limit
segment readable executable
entry $
mov edx,msg_size ; CPU zero extends 32-bit operation to 64-bit
; we can use less bytes than in case mov rdx,...
lea rsi,[msg]
mov edi,1 ; STDOUT
mov eax,1 ; sys_write
syscall
xor edi,edi ; exit code 0
mov eax,60 ; sys_exit
syscall
segment readable writeable
msg db 'Hello 64-bit world!',0xA
msg_size = $-msg
十六进制转储:
000000b0 ba 14 00 00 00 48 8d 35 15 10 00 00 bf 01 00 00 |.....H.5........|
000000c0 00 b8 01 00 00 00 0f 05 31 ff b8 3c 00 00 00 0f |........1..<....|
000000d0 05 48 65 6c 6c 6f 20 36 34 2d 62 69 74 20 77 6f |.Hello 64-bit wo|
000000e0 72 6c 64 21 0a |rld!.|
000000e5
正如你所看到的,指令兴趣lea rsi, [msg]
具有操作码:48 8d 35 15 10 00 00
。从CPU指令参考我可以看出,48
是64位前缀的排序,8d
是LEA
代码,35
是目标寄存器rsi
参考,而15 10 00 00
是... ???它是什么?
0x15
是21
的十进制数,我可以用一个手指跟踪十六进制转储,即“Hello world”消息正好是LEA rsi, [msg]
指令后的21个字节。所以它必须是一个相对地址,但10 00 00
来自哪里?我会理解,如果它是15
00 00
,但由于某种原因它是15
00 00
。
不幸的是,CPU引用并不是非常有用,它们非常正式,我无法与它们相处。他们是这样的:
8D r LEA Gvqp M gen datamov Load Effective Address
所以,请解释LEA
操作码是如何在这种情况下产生的,如果可能的话一般英寸
这是否意味着整个二进制文件'hello'被加载到所有(两个)段中?我的意思是*整个*文件,而不仅仅是段的数据'phoff-phoff + phsize'。 – exebook
如果你的意思是它将如何被操作系统加载,那么我不确定。我还没有处理ELF可执行文件的这些细节。 – Michael