Advertisement
Guest User

MASM64 sample

a guest
Aug 27th, 2013
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.70 KB | None | 0 0
  1. ; ml64 /Zi helloworld.asm /link /debug /subsystem:console /entry:mainCRTStartup
  2.  
  3. include macamd64.inc
  4. includelib libcmt.lib
  5.  
  6. _text segment
  7.  
  8. msg1 db 'Hello world', 0dh, 0ah, 0
  9. msg2 db 'Hello world', 0
  10. msg3 db 'ecx = %d, rdx = "%s"', 0dh, 0ah, 0
  11. msg4 db 'argc %d', 0
  12. msg5 db ' argv[%d] = "%s"', 0
  13.  
  14. extern printf:proc
  15. extern putchar:proc
  16. ;printf proto arg1:ptr byte, args: VARARG
  17.  
  18.  
  19. public main
  20.  
  21. main proc frame
  22.  
  23. push_reg rbp
  24. push_reg rbx
  25. push_reg rsi
  26. push_reg rdi
  27.  
  28. ; alloc_stack(8*4+8) ; qword*4 + アライメント調整
  29. sub rsp, 8 ; リターンアドレスのためにアライメントが8バイトずれているので調整する
  30. set_frame rbp, 8*4+16
  31.  
  32. end_prologue ; フレームポインタを使わない時はこれ以降スタックの操作はできない
  33. ; その場合はプロローグで関数呼び出しのためのパラメータ領域を確保しておく
  34.  
  35. mov ebx, ecx ; argcを不揮発レジスタに保存
  36. mov rsi, rdx ; argv (char**)
  37.  
  38. sub rsp, 8*4 ; x64呼び出し規約のパラメータ領域
  39.  
  40. lea rcx, [msg1]
  41. call printf ; RIP相対モードなのでこの表現が可能
  42.  
  43. lea rcx, [msg3]
  44. mov edx, 100
  45. lea r8, [msg2]
  46. lea rax, printf
  47. call rax
  48.  
  49. lea rcx, [msg4]
  50. mov edx, ebx ; argc
  51. call printf
  52.  
  53. mov rdi, 0 ; index of argv
  54. loop1:
  55. lea rcx, [msg5]
  56. mov rdx, rdi
  57. mov r8, [rsi+rdi*8] ; argv[index]
  58. add rdi, 1
  59. call printf
  60. sub rbx, 1
  61. ja loop1
  62.  
  63. add rsp, 8*4 ; パラメータ領域解放
  64.  
  65. ; add rsp, 8*4+8 ; alloc_stackと対応
  66. add rsp, 8
  67. pop rdi
  68. pop rsi
  69. pop rbx
  70. pop rbp
  71. ret
  72. main endp
  73.  
  74. _text ends
  75.  
  76. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement