Programovanie v assembleri vo Windows x64 (x86-64): Rozdiel medzi revíziami

Smazaný obsah Přidaný obsah
Fabcde (diskusia | príspevky)
Rozsirenie
Fabcde (diskusia | príspevky)
d odkazy
Riadok 6:
Kvôli jednoduchšiemu rozlíšeniu majú [[w:Zdrojový_kód|zdrojové súbory]] programov pre kompilátor NASM príponu .asm, objektové .obj, pre GNU Assembler .s, resp .o.
 
NASM používa syntax Intelu, dominujúcu v prostredí MS-DOS a Windows, GNU Asembler používa syntax AT&T, prevládajúcu v Unixovom svete. Jedným z rozdielov týchto dvoch syntaxí je opačné poradie argumentov v niektorých inštrukciách.<ref>Ram Narayan (2007-10-17). [https://www.ibm.com/developerworks/library/l-gas-nasm/index.html "Linux assemblers: A comparison of GAS and NASM"]
</ref> Napríklad inštrukcia "vlož hodnotu nula do registra AX" sa v NASM zapisuje <code>MOV AX, 0</code>, v GAS <code>MOV $0, %AX</code>. Intelovská syntax (NASM) pripomína priraďovací príkaz vyšších programovacích jazykov <code>AX=0</code>, AT&T syntax (GAS) skôr niečo ako <code>0->AX</code>.
 
=== Volacie konvencie ===
Programy bežiace v [https://cs.wikipedia.org/wiki/Re%C3%A1ln%C3%BD_re%C5%BEim Reálnom móde] (operačný systém MS-DOS) alebo v móde (režime) [https://cs.wikipedia.org/wiki/Virtual_8086_mode Virtual 8086] (operačný systém Windows) mohli využívať služby operačného systému MS-DOS (MS-DOS API). Tieto sa volali pomocou softvérového prerušenia inštrukciou INT, napríklad <code>INT 21h</code>. 64-bitové verzie OS Windows režim Virtual 8086 nepodporujú. Služby operačného systému je možné zabezpečiť jedine volaním funkcií Windows API (WinAPI). Podprogramu (funkcii) je potrebné väčšinou nejakým spôsobom odovzdať argumenty a opačným smerom zase výsledok. V zásade nie sú žiadne obmedzenia týkajúce sa spôsobu odovzdávania dát medzi volajúcim a volaným podprogramom. Je možné zvoliť akýkoľvek fungujúci spôsob ([https://cs.wikipedia.org/wiki/Volac%C3%AD_konvence volacia konvencia]), či už pomocou registrov, pamäti, zásobníka, len treba vedieť o každej jednej volanej funkcii/podprograme, kde očakáva argumenty a kam ukladá výsledok.
 
Toto sú niektoré, vo svete Windowsz najčastejšie používané,používaných volacie[[wikipedia:X86_calling_conventions|volacích konvenciekonvencií (calling convention) vo svete Windows]]:
* [[wikipedia:X86_calling_conventions#cdecl|cdecl]] - C declaration, pochádza z jazyka C, parametre sú ukladané na zásobník postupne z prava do ľava (kvôli podpore premenlivého počtu argumentov), výsledok je uložený buď v registry EAX (integer) alebo ST0 (float), zásobník čistí volajúca funkcia
 
* [[wikipedia:X86_calling_conventions#pascal|pascal]] - parametre sú ukladané na zásobník z ľava do prava, zásobník čistí volaná funkcia (napríklad inštrukciou RET n)
* [[wikipedia:X86_calling_conventions#stdcall|stdcall]] - štandard pre Win32 API, parametre sú ukladané na zásobník z prava do ľava (ako cdecl), ale zásobník čistí volaná funkcia (ako pascal)
* [[wikipedia:X86_calling_conventions#Microsoft_x64_calling_convention|Microsoft x64]] - volania WinAPI v 64-bitových programoch pre MS Windows, prvé štyryštyri parametre sú uložené v RCX/XMM0, RDX/XMM1, R8/XMM2, R9/XMM3 (integer/float), zvyšné v zásobníku z prava do ľava, výsledok je vrátený v registry RAX alebo XMM0, zásobník čistí volajúca funkcia
 
=== Hello, World! ===
Náš prvý program vypíše v príkazovom riadku krátky text a skončí (verzia pre NASM)<ref>https://stackoverflow.com/questions/35965407/trying-to-read-console-input-from-x64-assembler-using-pure-win64-apis-no-c-runt</ref>:<syntaxhighlight lang="nasm" line="1">
; HelloWorld.asm
 
Řádek 170 ⟶ 171:
</syntaxhighlight>Alebo<syntaxhighlight>
G:\>gcc -m64 -nostartfiles -Wl,-emain -o HelloWorld.exe HelloWorld.s c:\windows\system32\kernel32.dll
</syntaxhighlight>Pozn: (golink si nerozumel s objektovým súborom kompilátora as)
 
== Referencie ==
https://stackoverflow.com/questions/35965407/trying-to-read-console-input-from-x64-assembler-using-pure-win64-apis-no-c-runt
<references />
 
== Ďalšie zdroje ==
Užitočné adresy:
http://cs.lmu.edu/~ray/notes/x86assembly/
 
http://frdsa.fri.uniza.sk/~janosik/Kniha/ProgJSA.html
 
https://www.pcrevue.sk/a/ASSEMBLER-pod-Windows--Uvod--1--cast
[[Kategória:Počítače]]