Assembly 对齐,模&引用;因此,它可以在每个函数输入处依赖ESP=12模16。”;
我想知道是否有人能在这里解释“模”的用法: 用于32位Linux和Mac OS x的Gnu编译器版本3.x及更高版本构成了堆栈 指针在每个函数调用指令处以16对齐。因此,它可以依赖ESP=12 每个函数项的模16* 顺便说一句,我知道这里的字大小是四个字节,12模16是12。除此之外,我真的不明白ESP=12模16的说法Assembly 对齐,模&引用;因此,它可以在每个函数输入处依赖ESP=12模16。”;,assembly,alignment,modularity,modular,mod,Assembly,Alignment,Modularity,Modular,Mod,我想知道是否有人能在这里解释“模”的用法: 用于32位Linux和Mac OS x的Gnu编译器版本3.x及更高版本构成了堆栈 指针在每个函数调用指令处以16对齐。因此,它可以依赖ESP=12 每个函数项的模16* 顺便说一句,我知道这里的字大小是四个字节,12模16是12。除此之外,我真的不明白ESP=12模16的说法 从 的含义是标准的数学含义,xmody是xdivy的其余部分,其中div是整数除法。 当自然数上存在周期性时,自然会产生模数,要了解这一点,只需对前30个数进行计算xmod5
- 从
- 的含义是标准的数学含义,
xmody
是xdivy
的其余部分,其中div
是整数除法。当自然数上存在周期性时,自然会产生模数,要了解这一点,只需对前30个数进行计算
xmod5
对齐要求地址是某个数字n的倍数,因为x是n的倍数iif x mod n==0,这将模数与对齐链接起来
自然上的模是一种易于可视化的操作:在n边界对齐地址时,有n种可能的情况需要考虑,尽管地址集可能是无限的。例如,要对齐并在4-边界处寻址,请使用1、5、9、13等地址。。。都是相等的,因为它们是4的倍数以上的一个值。
对于所有这些,我们只需要添加3 <>所以,对于n个边界上的对齐,我们只考虑地址是0, 1, 2的情况,…n-1字节,高于n的倍数 “ESP=12模16”表示
ESP
比16的地址倍数高12字节。请注意,高于16的倍数12个字节等于低于下一个16的倍数4个字节。
可视化
01234567891011113141415
我们可以通过加1到右边,通过减1到左边
调用后esp
为12模16的原因是,如果执行类似call function
的指令时,堆栈按16字节对齐(即esp
为0模16),则调用后堆栈立即降低4字节1(由于call
指令推送返回地址)因此,从之前16的倍数中减去12字节
... 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 ...
^ ^-- Before the call
|__ After the call
请记住,堆栈会向下扩展。的含义是标准的数学含义,
x mod y
是x div y
的其余部分,其中div
是整数除法。当自然数上存在周期性时,自然会产生模数,要了解这一点,只需对前30个数进行计算
xmod5
对齐要求地址是某个数字n的倍数,因为x是n的倍数iif x mod n==0,这将模数与对齐链接起来
自然上的模是一种易于可视化的操作:在n边界对齐地址时,有n种可能的情况需要考虑,尽管地址集可能是无限的。例如,要对齐并在4-边界处寻址,请使用1、5、9、13等地址。。。都是相等的,因为它们是4的倍数以上的一个值。
对于所有这些,我们只需要添加3 <>所以,对于n个边界上的对齐,我们只考虑地址是0, 1, 2的情况,…n-1字节,高于n的倍数 “ESP=12模16”表示
ESP
比16的地址倍数高12字节。请注意,高于16的倍数12个字节等于低于下一个16的倍数4个字节。
可视化
01234567891011113141415
我们可以通过加1到右边,通过减1到左边
调用后esp
为12模16的原因是,如果执行类似call function
的指令时,堆栈按16字节对齐(即esp
为0模16),则调用后堆栈立即降低4字节1(由于call
指令推送返回地址)因此,从之前16的倍数中减去12字节
... 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 ...
^ ^-- Before the call
|__ After the call
1请记住,堆栈会向下扩展。在函数调用之前,它是“模16”对齐的,
调用
指令本身会将4个字节放入堆栈中(32位模式下的返回地址),打破0对齐到-4(-4正模16=12);在函数输入时(在执行调用之后)。在函数调用之前,它是“模16”对齐的,调用
指令本身将把4个字节放入堆栈(32位模式下的返回地址),将0对齐中断为-4(-4正模16=12);在函数输入时(执行调用之后)。