c - 了解用于模计算的 Intel x86 程序集输出

标签 c assembly division modulo

我有一个关于编译器的学校项目,以及它在 Intel x86 和 ARMv7 之间的汇编代码有何不同,但我一直试图理解 Intel x86 架构的汇编。

源代码是:

int main()
{
int a=5,b=2;
int result;
result = a % b;
printf("Result of 5 modulo 2 is %i\n", result);
}

汇编输出(gcc masm=Intel)

main:
/*
Intel32-x86 Arhchitecture
Little endian

ebp register -- base pointer
esp register -- stack pointer
*/
push    ebp ; ebp register put on stack
mov     ebp, esp ; Move data from ebp to esp
and     esp, -16 ; Logical AND ??
sub     esp, 32 ; Subtraction ??
mov     DWORD PTR [esp+20], 5 
;5 as 32 bits
;00000101-00000000-00000000-00000000
mov     DWORD PTR [esp+24], 2 
;2 as 32 bits
;00000010-00000000-00000000-00000000
mov     eax, DWORD PTR [esp+20]
mov     edx, eax
sar     edx, 31
;Shift Arithmetically right - edx med 31. 
;00000101-00000000-00000000-00000000 BEFORE
;00000000-00000000-00000000-00000000 AFTER
idiv    DWORD PTR [esp+24]
;Signed divide - IDIV r/m32 - EDX:EAX register
;Dividing EDX:EAX on value of esp+24, and save the remainder in edx.
;EDX:EAX 00000000-00000000-00000000-00000000-00000101-00000000-00000000-00000000
mov     DWORD PTR [esp+28], edx
mov     eax, OFFSET FLAT:.LC0
mov     edx, DWORD PTR [esp+28]
mov     DWORD PTR [esp+4], edx
mov     DWORD PTR [esp], eax
call    printf
leave
ret

尤其是 -16 ;逻辑与
子 esp, 32 ;减法

这两条指令的目的是什么?

最佳答案

目的在评论中提到:

        and     esp,-16    ;round esp down to 16 byte boundary
        sub     esp,32     ;allocate 32 bytes of space for local variables

如果您没有听懂有关签署延长股息的这一部分:

        mov     eax, DWORD PTR [esp+20] ; eax = dividend
        mov     edx, eax   ; edx = dividend
        sar     edx, 31    ; edx = 0 or -1 (the sign extension)

关于c - 了解用于模计算的 Intel x86 程序集输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29769459/

相关文章:

c - GNU 使 : different dependencies of several binaries in the same target?

c - 用一些零初始化一个 int 数组

c - C文件和S文件一起编译时出错

c - 除法结果始终为零

php - 在 PHP 中查找数字的倍数

go - 两个值的除法结果为 0

c - 在 C 语言中解析 DSL 比 lex/yacc 更好的解决方案?

c - 将列表传递给函数以在 C 中用可变数量的成员填充列表