Всем привет!
В раздел по Ассемблеру писать не могу, поэтому вопрос здесь. Прошу разъяснить участок кода в простейшем 64-битном Hello World:
Сразу после метки
В раздел по Ассемблеру писать не могу, поэтому вопрос здесь. Прошу разъяснить участок кода в простейшем 64-битном Hello World:
C-подобный:
format PE64 console
entry start
include "C:/Tools/Fasm/INCLUDE/win64ax.inc"
section '.data' data readable writeable
Message db 'Hello World!',0
Message.length = $ - Message
HandleFile dq ?
section '.text' code readable executable
start:
; 1 вариант
; sub rsp, 40
; and spl, -16
; 2 вариант
; sub rsp,8*(4+3)
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov [HandleFile],rax
stdcall PrintFunc, HandleFile
invoke ExitProcess,0
proc PrintFunc
invoke WriteConsole, [HandleFile], Message, Message.length, 0, 0
ret
endp
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL'
include 'api\kernel32.inc'
Сразу после метки
start
в отдельных примерах используются наборы инструкций (вариант 1 и 2). Как я понял, это что-то связано со стеком и выравниванием. Но не могу найти понятной инфы в сети. Для чего, в каких случаях это нужно? И как правильно? И нужно ли это для PE (а может для ELF)? Если сделаете статью по особенностям программирования на fasm для x64 - вообще вам не будет цены.