私は高レベルのコーダーであり、アーキテクチャーは私にとってかなり新しいので、ここでアセンブリに関するチュートリアルを読むことにしました。
http://en.wikibooks.org/wiki/X86_Assembly/Print_Version
チュートリアルのはるか下で、Hello World!を変換する方法について説明します。プログラム
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
同等のアセンブリコードが与えられ、以下が生成されました。
.text
LC0:
.ascii "Hello, world!\12\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
行の1つについては、
andl $-16, %esp
説明は:
このコードは、ESPを0xFFFFFFF0で「and」し、スタックを次に低い16バイト境界に揃えます。Mingwのソースコードを調べると、これは「_main」ルーチンに表示されるSIMD命令の場合であり、整列されたアドレスでのみ動作することがわかります。ルーチンにはSIMD命令が含まれていないため、この行は不要です。
この点はわかりません。スタックを次の16バイト境界に揃えることの意味と、それが必要な理由について誰かに説明してもらえますか?そして、andl
これをどのように達成していますか?