Assembly 对齐,模&引用;因此,它可以在每个函数输入处依赖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

我想知道是否有人能在这里解释“模”的用法:

用于32位Linux和Mac OS x的Gnu编译器版本3.x及更高版本构成了堆栈 指针在每个函数调用指令处以16对齐。因此,它可以依赖ESP=12 每个函数项的模16*

顺便说一句,我知道这里的字大小是四个字节,12模16是12。除此之外,我真的不明白ESP=12模16的说法

    • 的含义是标准的数学含义,
      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);在函数输入时(执行
      调用之后)。