Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 指令操作码生成_Assembly_Cpu_Opcode - Fatal编程技术网

Assembly 指令操作码生成

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

这个问题不是关于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 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可执行文件的这些细节。