x86アセンブリのマクロとプロシージャ/メソッドの違いについて説明できますか?私は完全に失われています。ありがとうございました。x86アセンブリのマクロとプロシージャ/メソッドの相違点
0
A
答えて
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. TVarData x86とx64の相違点Delphi
- 2. i386とx86-64メモリスタックの相違点
- 3. importとconstとの相違点とcommonjsでの相違点
- 4. IE標準、相違点および相違点の相違点
- 5. =と:=の相違点
- 6. PHPUnitとPHPSpecの相違点と相違点
- 7. CBUUIDとNSUUIDの相違点
- 8. NSTimeZoneとGMTの相違点
- 9. ListViewとArrayListの相違点
- 10. pictureBox.Update()とpictureBox.Refresh()の相違点
- 11. ApplicationContextInitializerとBeanFactoryPostProcessorの相違点
- 12. システムとshell_execの相違点
- 13. AsyncSocketとAsyncUdpSocketの相違点
- 14. .textと.get_text()の相違点
- 15. plt.close()とplt.clf()の相違点
- 16. `BeginSubscribeToStreamingNotifications`と` SubscribeToStreamingNotifications`の相違点
- 17. Delegate.InvokeとDelegateの相違点
- 18. InternalResourceViewResolverとUrlBasedViewResolverの相違点
- 19. tf.nn.convolutionとtf.nn.conv2dの相違点
- 20. Backbone.Layout.extendとBackbone.view.extendの相違点
- 21. JavaとMacOSの相違点
- 22. Yocto:CORE_IMAGE_EXTRA_INSTALLとIMAGE_INSTALLの相違点
- 23. window.someRandomVarとsomeRandomVarの相違点
- 24. CDRとxDRの相違点
- 25. gst_bus_add_watch()とg_signal_connect()の相違点
- 26. EventStreamとEventBusの相違点
- 27. System.Threading.Tasks.DataflowとMicrosoft.Tpls.Dataflowの相違点
- 28. mkfifo()とmknod()の相違点
- 29. java.homeとJAVA_HOMEの相違点
- 30. $ httpParamSerializerJQLikeと$ httpParamSerializerの相違点
https://www.tutorialspoint.com/assembly_programming/assembly_macros.htm末尾呼び出しが行われている場合はすることができます '関数にJMP'むしろCALL''より –
非常に真の、限り、あなたは繰り返し、JMPのための方法を持っているように」 dはJMPの次の場所を知るために機能する。 – Joe