Programovanie v assembleri vo Windows x64 (x86-64): Rozdiel medzi revíziami
Smazaný obsah Přidaný obsah
printf |
d robot kozmetické zmeny |
||
Riadok 8:
Skompilovaním zdrojového súboru príslušným kompilátorom (nasm resp. as) vznikne [[w:cs:Objektový kód|objektový súbor]], ktorý je následne pomocou [[w:cs:Linker|linkeru]] golink, resp. ld zlinkovaný do výsledného spustiteľného súboru. Kompilátor as (GNU Assembler) a linker ld sú súčasťou [[w:GNU_Compiler_Collection|gcc]]. Kvôli jednoduchšiemu rozlíšeniu majú tu uvedené [[w:Zdrojový_kód|zdrojové súbory]] programov určených pre NASM príponu .asm, objektové .obj, a pre GNU Assembler príponu .s, resp .o.
===
Programy bežiace v [[w:cs:Reálný režim|Reálnom móde]] (operačný systém MS-DOS) prípadne aj v móde (režime) [[w:cs:Virtual 8086 mode|Virtual 8086]] (operačný systém Windows) mohli využívať služby operačného systému MS-DOS prostredníctvom [[wikipedia:MS-DOS_API|MS-DOS API]]. Tieto sa volali pomocou [[w:cs:Přerušení#Softwarové přerušení|softvérového prerušenia]] inštrukciou INT, napríklad <code>INT 21h</code><ref>[http://www.cs.cmu.edu/~ralf/files.html Ralf Brown's Interrupt List]</ref>. Nakoľko 64-bitové verzie OS Windows režim Virtual 8086 nepodporujú, služby operačného systému je už možné zabezpečiť výlučne volaním funkcií [[w:cs:Windows API|Windows API]] (WinAPI).
Riadok 21:
=== Hello, World! ===
Náš prvý program vypíše v príkazovom riadku krátky text a skončí.
'''Výpis 1a''' HelloWorld.asm (Verzia pre NASM):<syntaxhighlight lang="nasm" line="1">
Riadok 27:
; kompilacia:
;
; linkovanie:
;
; alternativne linkovanie:
;
Riadok 42:
section .bss use64 ; neinicializovana datova oblast
lpNumberOfBytesWritten:
section .text use64 ; Program code
message:
MESSAGE_LEN:
main:
Riadok 84:
</syntaxhighlight>Ak kompilácia a linkovanie prebehli úspešne, môžme vyskúšať náš prvý 64-bitový program:<syntaxhighlight>
G:\>dir
15.07.2017
15.07.2017
15.07.2017
G:\>HelloWorld.exe
Riadok 135:
# kompilacia:
#
# linkovanie:
#
# alternativna kompilacia+linkovanie:
#
.global main
.section .bss
lpNumberOfBytesWritten:
.section .text
message:
MESSAGE_LEN = . - message
Riadok 185:
</syntaxhighlight>Výsledok:<syntaxhighlight>
G:\>dir
15.07.2017
16.07.2017
16.07.2017
G:\>HelloWorld.exe
Riadok 204:
MOV [RSP], RAX
</syntaxhighlight>Keďže architektúra x86/x86-64 používa na ukladanie viac-bajtových hodnôt usporiadanie [[w:Endianita|little-endian]], t.j. na nižšej adrese je uložený menej významný/nižší bajt, v zásobníku bude preto register RAX uložený:<syntaxhighlight>
| |
+==============+
|
+--------------+
|
+--------------+
|
+--------------+
|
+--------------+
|
+--------------+
|
+--------------+
|
+--------------+
|
+==============+
|
+--------------+
|
+--------------+
|
+==============+
</syntaxhighlight>Z vrcholu zásobníka sa hodnoty vyberajú inštrukciou POP. Inštrukcia <code>POP RAX</code> z vrcholu zásobníka prečíta hodnotu, vloží ju do registra RAX, a následne uvoľní miesto v zásobníku, podobne ako:<syntaxhighlight lang="nasm">
MOV RAX, [RSP]
Riadok 258:
''Obsah zásobníka po zavolaní WinAPI funkcie :''<syntaxhighlight>
+---------------------+
| zarovnanie,
| lokálne premenné a
| volatile registre
+=====================+
| návratová adresa
| z podprogramu (RIP) |
+---------------------+
| 32. bajtov
| shadow space
|
|
+---------------------+
| 5. argument
+---------------------+
| 6. argument
+---------------------+
| . | | |
+---------------------+
| posledný argument
+---------------------+
| zarovnanie,
| lokálne premenné a
| volatile registre
+=====================+
</syntaxhighlight>
=== Hello, World! v.2 ===
Program HelloWorld opravený v súlade s volacou konvenciou.
'''Výpis 2a''' HelloWorld.asm (Verzia pre NASM):<syntaxhighlight lang="nasm" line="1">
Riadok 292:
; kompilacia:
;
; linkovanie:
;
; alternativne linkovanie:
;
Riadok 307:
section .bss use64 ; neinicializovana datova oblast
lpNumberOfBytesWritten:
section .text use64 ; Program code
message:
MESSAGE_LEN:
main:
Riadok 358:
# kompilacia:
#
# linkovanie:
#
# alternativna kompilacia+linkovanie:
#
.global main
.section .bss
lpNumberOfBytesWritten:
.section .text
message:
MESSAGE_LEN = . - message
Riadok 420:
; kompilacia:
;
; linkovanie:
;
; alternativne linkovanie:
;
global main
extern
section .text use64 ; Program code
message:
main:
Riadok 462:
; kompilacia:
;
; linkovanie:
;
; alternativne linkovanie:
;
Riadok 477:
section .data use64 ; Program code
buffer:
enter:
lpNumberOfBytesWritten:
BUFFER_LEN:
NEWLINE_LEN:
Riadok 534:
# kompilacia:
#
# linkovanie:
#
# alternativna kompilacia+linkovanie:
#
.global main
.section .data
buffer:
enter:
lpNumberOfBytesWritten:
BUFFER_LEN =
NEWLINE_LEN =
Riadok 614:
<references />
==
* http://cs.lmu.edu/~ray/notes/x86assembly/
* http://frdsa.fri.uniza.sk/~janosik/Kniha/ProgJSA.html
|