Assembly 指令操作码生成
这个问题不是关于LEA指令的,也不是关于它是如何工作的,它不是一个复制品。这是关于此指令的操作码生成 LEA操作码中的操作数是多少 这是我的“hello world.fasm”: 汇编程序:Assembly 指令操作码生成,assembly,cpu,opcode,Assembly,Cpu,Opcode,这个问题不是关于LEA指令的,也不是关于它是如何工作的,它不是一个复制品。这是关于此指令的操作码生成 LEA操作码中的操作数是多少 这是我的“hello world.fasm”: 汇编程序: format ELF64 executable at 0000000100000000h ; put image over 32-bit limit segment readable executable entry $ mov edx,msg_size ; CPU zero ex
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
十六进制转储:
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
操作码,如果可能的话,请解释一般情况。我将回答您关于15 10 00 00
是什么的问题,而不是关于LEA
一般如何编码的其他问题
让我们通过readelf
获取一些关于可执行文件的信息:
$ readelf -l leatest
Program headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x00000000000000b0 0x00000001000000b0 0x00000001000000b0 0x0000000000000021 0x0000000000000021 R E 1000
LOAD 0x00000000000000d1 0x00000001000010d1 0x00000001000010d1 0x0000000000000014 0x0000000000000014 RW 1000
因此,字符串所在的第二个段的虚拟地址为
0x00000001000010d1
,而代码从虚拟地址0x00000001000000b0
开始。这些段在4096字节边界(0x1000)上对齐,因此字符串相对于使用is的指令位于0x10D1-0xBC
,is等于0x1015
。因此,您在hextump中看到151000
的原因是,这是相对偏移量0x00001015
,我将回答您关于151000
是什么的问题,而不是关于LEA
一般如何编码的其他问题
让我们通过readelf
获取一些关于可执行文件的信息:
$ readelf -l leatest
Program headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x00000000000000b0 0x00000001000000b0 0x00000001000000b0 0x0000000000000021 0x0000000000000021 R E 1000
LOAD 0x00000000000000d1 0x00000001000010d1 0x00000001000010d1 0x0000000000000014 0x0000000000000014 RW 1000
因此,字符串所在的第二个段的虚拟地址为
0x00000001000010d1
,而代码从虚拟地址0x00000001000000b0
开始。这些段在4096字节边界(0x1000)上对齐,因此字符串相对于使用is的指令位于0x10D1-0xBC
,is等于0x1015
。因此,您在hextump中看到151000
的原因是,这是相对偏移量0x00001015
,我将回答您关于151000
是什么的问题,而不是关于LEA
一般如何编码的其他问题
让我们通过readelf
获取一些关于可执行文件的信息:
$ readelf -l leatest
Program headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x00000000000000b0 0x00000001000000b0 0x00000001000000b0 0x0000000000000021 0x0000000000000021 R E 1000
LOAD 0x00000000000000d1 0x00000001000010d1 0x00000001000010d1 0x0000000000000014 0x0000000000000014 RW 1000
因此,字符串所在的第二个段的虚拟地址为
0x00000001000010d1
,而代码从虚拟地址0x00000001000000b0
开始。这些段在4096字节边界(0x1000)上对齐,因此字符串相对于使用is的指令位于0x10D1-0xBC
,is等于0x1015
。因此,您在hextump中看到151000
的原因是,这是相对偏移量0x00001015
,我将回答您关于151000
是什么的问题,而不是关于LEA
一般如何编码的其他问题
让我们通过readelf
获取一些关于可执行文件的信息:
$ readelf -l leatest
Program headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x00000000000000b0 0x00000001000000b0 0x00000001000000b0 0x0000000000000021 0x0000000000000021 R E 1000
LOAD 0x00000000000000d1 0x00000001000010d1 0x00000001000010d1 0x0000000000000014 0x0000000000000014 RW 1000
因此,字符串所在的第二个段的虚拟地址为
0x00000001000010d1
,而代码从虚拟地址0x00000001000000b0
开始。这些段在4096字节边界(0x1000)上对齐,因此字符串相对于使用is的指令位于0x10D1-0xBC
,is等于0x1015
。因此,为什么您在hextump中看到15 10 00 00
,因为这是相对偏移量0x00001015
,这是否意味着整个二进制文件hello
在所有(两)段中加载?我指的是整个文件,而不仅仅是段的数据phoff phoff+phsize
。如果你指的是操作系统将如何加载它,那么我不确定。我还没有处理ELF可执行文件的这些细节。这是否意味着整个二进制文件hello
在所有(两)段中加载?我指的是整个文件,而不仅仅是段的数据phoff phoff+phsize
。如果你指的是操作系统将如何加载它,那么我不确定。我还没有处理ELF可执行文件的这些细节。这是否意味着整个二进制文件hello
在所有(两)段中加载?我指的是整个文件,而不仅仅是段的数据phoff phoff+phsize
。如果你指的是操作系统将如何加载它,那么我不确定。我还没有处理ELF可执行文件的这些细节。这是否意味着整个二进制文件hello
在所有(两)段中加载?我指的是整个文件,而不仅仅是段的数据phoff phoff+phsize
。如果你指的是操作系统将如何加载它,那么我不确定。我还没有处理过ELF可执行文件的这些细节。