明らかに、Linuxの呼び出し規約 "System V AMD64 ABI"に続くGCC呼び出し規約に従って、64ビットLinux上のGCC環境でコマンドラインパラメータを取得したいとします。
のは、Cにプログラムロジックを翻訳してみましょう:
#include <stdio.h>
int main (int argc, char** argv)
{
if (argc != 0)
{
do
{
puts (*argv);
argc--;
argv++;
} while (argc);
}
return;
}
ASMプログラムは終了コードを返しません。関数が復帰すると、終了コードはRAX
になります。最初の文字列argv
がプログラム名を保持しているため、BTW:argc
は常に0以上です。
main
機能は、「発信者」(コールputs
)と「着信音」(GCC環境に戻ります)の両方です。呼び出し元としてputs
への呼び出しの前にRAX
とRSI
を保存し、必要なときに復元する必要があります。呼び出し先保存レジスタは使用されません。これは、作品16
によってスタックを揃えることを忘れないでください:
extern puts
global main
section .text
main: ; RDI: argc, RSI: argv, stack is unaligned by 8
mov rax, rdi
label:
test rax, rax
je exit
push rbx ; Push 8 bytes to align the stack before the call
push rax ; Save it (caller-saved)
push rsi ; Save it (caller-saved)
mov rdi, [rsi] ; Argument for puts
call puts
pop rsi ; Restore it
pop rax ; Restore it
pop rbx ; "Unalign" the stack
dec rax
add rsi, 8
jmp label
exit:
; pop rsi ; Once too much
xor eax, eax ; RAX = 0 (return 0)
ret ; RAX: return value