Od paru dni zamierzam tak dla własnej przyjemności poznać przynajmniej podstawy asemblera. Nie posiadam jeszcze żadnej książki ale mam i przeczytałem kurs P. Drozdowskiego (chociaż dla DOSa) i czytam obecnie kurs Iczeliona. Wybrałem i korzystam z FASMa (dużo powodów, których nie będę wymieniał).
Na stronie forum FASMa w wątku o programie HelloWorld (bo jakżeby inaczej - od tego trzeba zacząć) jeden z forumowiczów podał taki kod (wybrałem ten, bo moim środowiskiem jest też Win7 64-bit):
; Example of 64-bit PE program
format PE64 GUI
entry start
section '.text' code readable executable
start:
sub rsp,8*5 ; reserve stack for API use and make stack dqword aligned
mov r9d,0
lea r8,[_caption]
lea rdx,[_message]
mov rcx,0
call [MessageBoxA]
mov ecx,eax
call [ExitProcess]
section '.data' data readable writeable
_caption db 'Win64 assembly program',0
_message db 'Hello World!',0
section '.idata' import data readable writeable
dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA user_name,RVA user_table
dd 0,0,0,0,0
kernel_table:
ExitProcess dq RVA _ExitProcess
dq 0
user_table:
MessageBoxA dq RVA _MessageBoxA
dq 0
kernel_name db 'KERNEL32.DLL',0
user_name db 'USER32.DLL',0
_ExitProcess dw 0
db 'ExitProcess',0
_MessageBoxA dw 0
db 'MessageBoxA',0
Moje pytanie dotyczy trzech linii:
dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA user_name,RVA user_table
dd 0,0,0,0,0
Chodzi o te zera. Dlaczego jest ich aż tyle i jeszcze dodatkowo 5 zer na końcu? To nie jest wytłumaczone ani w kursie P. Drozdowskiego ani w kursie Iczeliona. Proszę o pomoc. I to prostym językiem. Ja asemblera się dopiero uczę.
PS. wiem że można program HelloWorld w asmie napisać szybciej i kod będzie krótszy stosując includy, które są w katalogu po rozpakowaniu FASMa ale nie chcę na razie z nich korzystać bo choć skrócą mi kod to i tak nie będę wiedział dlaczego mi go skracają nie znając specyfiki samego FASMa i asemblera.