2017-02-27 15 views

答えて

1

マクロは最終コンパイルステップの前にインライン展開され、プロシージャは最終実行ファイルで 'call'および 'ret'オペレーションでインプリメントされます。

マクロは基本的にはソースコードをよりきれいにする構文の砂糖であり、より速く入力できるようにしています。 (そのままコピー)、下のリンクからマクロの例を使用するには:

; A macro with two parameters 
; Implements the write system call 
    %macro write_string 2 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, %1 
     mov edx, %2 
     int 80h 
    %endmacro 

section .text 
    global _start   ;must be declared for using gcc 

_start:      ;tell linker entry point 
    write_string msg1, len1    
    write_string msg2, len2  
    write_string msg3, len3 

    mov eax,1    ;system call number (sys_exit) 
    int 0x80     ;call kernel 

section .data 
msg1 db 'Hello, programmers!',0xA,0xD 
len1 equ $ - msg1   

msg2 db 'Welcome to the world of,', 0xA,0xD 
len2 equ $- msg2 

msg3 db 'Linux assembly programming! ' 
len3 equ $- msg3 

はこれはと同等のようになります。

section .text 
    global _start   ;must be declared for using gcc 

_start:      ;tell linker entry point 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, msg1 
    mov edx, len1 
    int 80h    
    mov eax, 4 
    mov ebx, 1 
    mov ecx, msg2 
    mov edx, len2 
    int 80h  
    mov eax, 4 
    mov ebx, 1 
    mov ecx, msg3 
    mov edx, len3 
    int 80h 
    mov eax,1    ;system call number (sys_exit) 
    int 0x80     ;call kernel 

section .data 
msg1 db 'Hello, programmers!',0xA,0xD 
len1 equ $ - msg1   

msg2 db 'Welcome to the world of,', 0xA,0xD 
len2 equ $- msg2 

msg3 db 'Linux assembly programming! ' 
len3 equ $- msg3 

マクロを使用して、元のコードは、より簡単に、より簡潔であることがわかります読む。 2番目の形式は、コンパイラが各マクロへの参照を展開した後、最終的にコンパイルされるものです。

プロシージャはそのように複製されません。プロシージャは一度コンパイルされ、プロシージャを入力するための 'call'オペコードと、プロシージャを入力する 'ret'オペコードが使用されます。

プロシージャとして重要でない機能を実装すると、呼び出しごとにコードが複製されないため、実行可能ファイルのサイズが小さくなります。ただし、プロシージャを使用するということは、必要なパラメータをレジスタ経由で処理する必要があり、 'call'と 'ret'自体が実行時間がゼロでないことを意味します。したがって、関数が十分に大きく、コード内の十分な場所で呼び出されると、サイズとパフォーマンスのトレードオフになります。

https://www.tutorialspoint.com/assembly_programming/assembly_procedures.htm

+1

https://www.tutorialspoint.com/assembly_programming/assembly_macros.htm末尾呼び出しが行われている場合はすることができます '関数にJMP'むしろCALL''より –

+1

非常に真の、限り、あなたは繰り返し、JMPのための方法を持っているように」 dはJMPの次の場所を知るために機能する。 – Joe

関連する問題