Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ml64 /Zi helloworld.asm /link /debug /subsystem:console /entry:mainCRTStartup
- include macamd64.inc
- includelib libcmt.lib
- _text segment
- msg1 db 'Hello world', 0dh, 0ah, 0
- msg2 db 'Hello world', 0
- msg3 db 'ecx = %d, rdx = "%s"', 0dh, 0ah, 0
- msg4 db 'argc %d', 0
- msg5 db ' argv[%d] = "%s"', 0
- extern printf:proc
- extern putchar:proc
- ;printf proto arg1:ptr byte, args: VARARG
- public main
- main proc frame
- push_reg rbp
- push_reg rbx
- push_reg rsi
- push_reg rdi
- ; alloc_stack(8*4+8) ; qword*4 + アライメント調整
- sub rsp, 8 ; リターンアドレスのためにアライメントが8バイトずれているので調整する
- set_frame rbp, 8*4+16
- end_prologue ; フレームポインタを使わない時はこれ以降スタックの操作はできない
- ; その場合はプロローグで関数呼び出しのためのパラメータ領域を確保しておく
- mov ebx, ecx ; argcを不揮発レジスタに保存
- mov rsi, rdx ; argv (char**)
- sub rsp, 8*4 ; x64呼び出し規約のパラメータ領域
- lea rcx, [msg1]
- call printf ; RIP相対モードなのでこの表現が可能
- lea rcx, [msg3]
- mov edx, 100
- lea r8, [msg2]
- lea rax, printf
- call rax
- lea rcx, [msg4]
- mov edx, ebx ; argc
- call printf
- mov rdi, 0 ; index of argv
- loop1:
- lea rcx, [msg5]
- mov rdx, rdi
- mov r8, [rsi+rdi*8] ; argv[index]
- add rdi, 1
- call printf
- sub rbx, 1
- ja loop1
- add rsp, 8*4 ; パラメータ領域解放
- ; add rsp, 8*4+8 ; alloc_stackと対応
- add rsp, 8
- pop rdi
- pop rsi
- pop rbx
- pop rbp
- ret
- main endp
- _text ends
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement