Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Memory 英特尔ia 32上的内存寻址_Memory_Assembly_Intel_Malware - Fatal编程技术网

Memory 英特尔ia 32上的内存寻址

Memory 英特尔ia 32上的内存寻址,memory,assembly,intel,malware,Memory,Assembly,Intel,Malware,我知道内存寻址可以用字大小的倍数来完成,所以对于Intel 32位,在汇编中的堆栈上分配内存可以用 //pseudo code sub , esp ,4 // so for allocating for a integer on stack sub esp, 8 // for a buffer of size 5 for example b[5] 所以寻址是用4的倍数来完成的。因此,在堆栈上引用局部变量和参数也是通过 // referring to vari

我知道内存寻址可以用字大小的倍数来完成,所以对于Intel 32位,在汇编中的堆栈上分配内存可以用

    //pseudo code
    sub , esp ,4 // so for allocating for a integer on stack
    sub esp, 8 // for a buffer of size 5 for example b[5] 
所以寻址是用4的倍数来完成的。因此,在堆栈上引用局部变量和参数也是通过

     // referring to variable --ebp-4
但有时在拆卸过程中,我会看到一些说明,如

     movb   $0x41, 0xffffffff(%ebp)   ,// refer to ebp-1 for example
所以它指的是1字节的内存

所以它指的是一个字节,而不是4个字节的倍数。4个字节的倍数仅用于esp?或者它与每个登记册都有关系

适用于80x86(所有模式);寻址总是以字节粒度完成的

对于所有普通指令(不包括SSE等扩展),CPU不需要对齐,任何对齐都只是出于性能原因。

对于80x86(所有模式);寻址总是以字节粒度完成的

对于所有普通指令(不包括SSE等扩展),CPU不需要对齐,任何对齐都只是出于性能原因

4字节的倍数仅适用于esp?或者它与每个登记册都有关系

注意

子esp,N

不访问任何内存位置,使用与内存对齐有关,但指令本身是一个简单的寄存器立即减法,它可以使用任何值。

出于性能原因,如果读取16位,则它们应位于2的地址倍数上,32位应位于4的地址倍数上。
这称为自然边界定线

32位系统只能
push
/
pop
16位或32位值,如果我们在
sub esp,N
等指令中仅使用4的倍数,则
push
/
pop
访问与其自然边界对齐的数据(注意4是2的倍数)

堆栈上的数据也可以通过如下指令直接访问

     movb   $0x41, 0xffffffff(%ebp)   ,// refer to ebp-1 for example
mov[ebp-04h],eax

这里的原理是相同的,EBP是4的倍数(注意,它的值是减法之前的旧ESP值),因此32位数据存储在4的地址倍数中(自然对齐)

字节的自然对齐方式是。。。1.这意味着它们应该位于地址1的倍数,即处处。
这就是为什么
mov[ebp-01h],'A'
执行为
mov[ebp-04h],'A'


琐事

根据经验法则,IA32e通用指令可以在每个地址从字节读/写到qwords。
整个对齐过程主要是出于性能原因,不像RISC机器,它们无法从结构上访问未对齐的数据

最初引入SSE指令时,同一指令的快速“对齐”(如
movaps
)和慢速“未对齐”(如
movups
)版本

64位系统现在明确要求128位堆栈对齐,以更好地执行向量指令(和加宽的寄存器)

CPU在EFLAGS寄存器中有一个位AC,允许程序启用或禁用严格对齐策略(RISC),假设操作系统已启用此功能(在CR0中设置AM)

将数据与CPU数据总线(无论在现代集成DRAM控制器上如何定义)更严格地对齐是毫无意义的。
这就是为什么新的ABI在128位上对齐,即使CPU可以有512位寄存器。

每个指令的对齐要求可在上找到。

4字节的倍数仅适用于esp?或者它与每个登记册都有关系

注意

子esp,N

不访问任何内存位置,使用与内存对齐有关,但指令本身是一个简单的寄存器立即减法,它可以使用任何值。

出于性能原因,如果读取16位,则它们应位于2的地址倍数上,32位应位于4的地址倍数上。
这称为自然边界定线

32位系统只能
push
/
pop
16位或32位值,如果我们在
sub esp,N
等指令中仅使用4的倍数,则
push
/
pop
访问与其自然边界对齐的数据(注意4是2的倍数)

堆栈上的数据也可以通过如下指令直接访问

     movb   $0x41, 0xffffffff(%ebp)   ,// refer to ebp-1 for example
mov[ebp-04h],eax

这里的原理是相同的,EBP是4的倍数(注意,它的值是减法之前的旧ESP值),因此32位数据存储在4的地址倍数中(自然对齐)

字节的自然对齐方式是。。。1.这意味着它们应该位于地址1的倍数,即处处。
这就是为什么
mov[ebp-01h],'A'
执行为
mov[ebp-04h],'A'


琐事

根据经验法则,IA32e通用指令可以在每个地址从字节读/写到qwords。
整个对齐过程主要是出于性能原因,不像RISC机器,它们无法从结构上访问未对齐的数据

最初引入SSE指令时,同一指令的快速“对齐”(如
movaps
)和慢速“未对齐”(如
movups
)版本

64位系统现在明确要求128位堆栈对齐,以更好地执行向量指令(和加宽的寄存器)

CPU在EFLAGS寄存器中有一个位AC,允许程序启用或禁用严格对齐策略(RISC),假设操作系统已启用此功能(在CR0中设置AM)

将数据与CPU数据总线(无论在现代集成DRAM控制器上如何定义)更严格地对齐是毫无意义的。
这就是为什么新的ABI在128位上对齐,即使CPU可以有512位寄存器。