7.6.2016 0 Comments

ASSEMBLER pod Windows: Úvod (1. časť)

Späť na úvod >> Späť na programovanie >> Späť na seriál

Vítam vás pri novom seriáli. Niektorí z vás si určite spomínajú na seriál Programujeme v assembleri, výhradne venovaný programovaniu v assembleri v operačnom systéme DOS. Tentoraz prichádzam s programovaním v assembleri pod Windows. Seriál bude určený hlavne začiatočníkom, ale azda si tu nájdu niečo aj tí, ktorí sa o uvedenú problematiku už nejaký čas zaujímajú. Keďže tento seriál je akýmsi pokračovaním predchádzajúceho, nebudem znova vysvetľovať základné pojmy, inštrukcie a pod. Všetko to nájdete v PC REVUE č. 7/1997 5/1999, prípadne časť dokumentu (Programovanie v ASM pod DOS-om) môžete nájsť aj na internetovej adrese: http://docs.linux.cz/programming/asm/gasparovic/. Aspoň stručne spomeňme, čoho sa bude tento seriál týkať:

1. Úvod

2. Prekladač MASM, zdroje WWW, API

3. Jednoduché príklady v assembleri

Najdôležitejším nástrojom, ktorý budete na preklad asm kódu potrebovať, je prekladač assemblera MASM (Microsoft ASseMbler). Prekladač môžete získať na adrese http://www.pbq.com.au/home/hutch/masm.htm, ide o súbor s názvom masm32v6.zip. Myslím, že inštaláciu netreba opisovať, pretože s výnimkou niekoľkých kliknutí je úplne automatická. Po nainštalovaní programu MASM je vhodné, ak si vytvoríte asociáciu na príponu .asm. Ja som použil program Windows Commander. V menu File vyberte položku Associate with... a vytvorte asociáciu. Programom, ktorý bude otvárať daný asm súbor, je Qeditor.exe (nachádza sa v adresári MASM32). Qeditor (obr. 1) tiež môžete používať na písanie aj prekladanie svojich assemblerových programov.

 

Obr. 1: Program Qeditor

Podrobnejšie informácie o Qeditore nájdete v súbore Qeditor.hlp. Adresár BIN obsahuje programy, ktoré sa používajú na preklad alebo spracovanie zdrojového kódu. Tieto programy využíva program Qeditor na spracovanie inštrukcií assemblera a preklad kódu do execute tvaru. Konkrétne ide o nasledujúce programy:

Microsoft (R) Macro Assembler Version 6.14.8444 (ml.exe)

Microsoft (R) Incremental Linker Version 5.12.8078 (link.exe)

Microsoft (R) Windows (R) Resource Compiler, Version 5.00.1823.1 – Build 1823 (rc.exe)

Microsoft (R) Library Manager Version 5.12.8078 (lib.exe)

Microsoft (R) COFF Binary File Editor Version 5.12.8078 (editbin.exe)

Microsoft (R) COFF Binary File Dumper Version 5.12.8078 (dumpbin.exe)

Microsoft (R) Windows Resource To Object Converter Version 5.00.1736.1 (cvtres.exe)

DumpPE v1.23 (c) Copyright Tenth Planet Software Intl., C Turvey 1995-1999 (dumppe.exe)

SDK library to ANSI ASM include file converter Version 1.2A (l2inca.exe)

SDK library to UNICODE ASM include file converter Version 1.2U (l2incu.exe)

 

Kostra programu

Kostra programu v assembleri pre Windows môže byť zostavená napríklad takto:

.386

.model flat, stdcall

 option casemap : none

.data ;inicializované dáta

.data? ;neinicializované dáta

.const ;konštanty

.code  ;kód vášho programu

<label>

        ...

        end <label>

Direktíva .386 sa používa na nastavenie inštrukčnej sady procesora 80386. Prípustné sú aj direktívy .486, .586, .686.

Pamäťový model (.model flat, stdcall)

Direktíva .model definuje pamäťový model a v zdrojovom texte sa uvádza vždy na začiatku. Direktíva sa môže objaviť v zdrojovom súbore iba raz. Pamäťový model môže byť jeden z nasledujúcich typov: TINY, SMALL, COMPACT, MEDIUM, LARGE, HUGE, alebo FLAT.

Syntax:   .MODEL memorymodel [,langtype] [,ostype] [,stackoption]

V tabuľke 1 sa nachádzajú vlastnosti jednotlivých pamäťových modelov. Ak sa pozriete do tabuľky, zistíte, že nám vyhovuje iba pamäťový model flat, pretože ako jediný má uvedenú šírku segmentu 32 bitov.

Pamäťový model flat spôsobí, že program bude obsahovať jeden 32-bitový segment pre dáta a kód. Generovanie kódu s použitím modelu flat nemôže byť použité na procesoroch nižšej triedy ako 80386/486. Direktívy .386 a .486 musia predchádzať direktíve .model. Tento pamäťový model donúti assembler produkovať súbory s koncovkou .EXE. Všetky segmentové registre sú automaticky nastavené na ten istý pamäťový model. Implicitne programy vo flat modeli používajú adresovanie NEAR pre kód aj dáta. Pri voľbe flat model je dĺžka PROC NEAR. @CodeSize=0, @DataSize=0 a @Model=7.

Segmentové registre FS a GS nie sú pre programy s flat modelom potrebné. Príkaz .MODEL FLAT automaticky generuje tento predpoklad:

ASSUME cs:FLAT, ds:FLAT, ss:FLAT, es:FLAT, fs:ERROR, gs:ERROR

Ak definujete segmenty pomocou direktívy SEGMENT, použite tento ASSUME vo vašom kóde.

 

 

Code

Data

Segment

Data and Code

 

Distance

Distance

Width

Combined?

Tiny

NEAR

NEAR

16-bit

Yes

Small

NEAR

NEAR

16-bit

No

Compact

NEAR

FAR

16-bit

No

Medium

FAR

NEAR

16-bit

No

Large

FAR

FAR

16-bit

No

Huge

FAR

FAR

16-bit

No

Flat

NEAR

NEAR

32-bit

Yes

Tab. 1 Prehľad pamäťových modelov

Direktívami OPTION SEGMENT a SEGMENT môžete anulovať štandardnú šírku segmentu.

 

 

C

SYSCALL

STDCALL

BASIC

FORTRAN

PASCAL

Leading Underscore

 

 

 

 

Capitalize All

 

 

 

Argument Left to Right

 

 

 

Argument Right to Left

 

 

 

Caller Stack Cleanup

 

*

 

 

 

BP Saved

 

 

 

:VARARG Allowed

 

 

 

Tab. 2 Volacie konvencie
 

 *  Jazykový symbol STDCALL používa volanie na vymazanie zásobníka, ak je používaný parameter :VARARG, alebo volaná rutina musí vymazať zásobník.

Jazykový typ (langtype) určuje mená a volacie konvencie používané v assembleri. Dovoľuje vám zdieľať kód a dáta s modulmi napísanými v iných jazykoch. Nastavenie jazykového typu dosiahnete pomocou direktív .MODEL alebo OPTION LANGTYPE, prípadne s použitím voľby /G<x> v príkazovom riadku. Niekoľko direktív vám dovolí špecifikovať parameter <langtype> na dočasné anulovanie jazykového typu. Môžete použiť voľbu /H v príkazovom riadku na obmedzenie dĺžky mien v objektovom súbore. Použitie tejto voľby pri práci s jazykmi obmedzí maximálnu dĺžku identifikátorov.

Direktíva langtype ovplyvňuje direktívy PUBLIC, EXTERN, PROC, PROTO a INVOKE.

<ostype> aktuálne podporovaná je iba voľba OS_DOS, je štandardne nastavená.

<stackoption> NEARSTACK (ak SS = DS) alebo FARSTACK (ak SS <> DS). Štandardne je nastavené NEARSTACK.

Direktíva OPTIONS CASEMAP:maptype kontroluje mapovanie znakov na veľké písmená. Parameter <maptype> môže byť ALL, NONE alebo NOTPUBLIC. Tieto parametre korešpondujú s voľbami na príkazovom riadku /Cu, /Cp a /Cx. Túto voľbu môžete v zdrojovom súbore použiť iba raz. Štandardné nastavenie je CASEMAP:NOTPUBLIC.

Na definovanie jednotlivých segmentov použijeme nasledujúce direktívy.

.CODE – direktíva určuje začiatok kódového segmentu, .DATA – direktíva určuje začiatok dátového segmentu, .DATA? – direktíva určuje začiatok segmentu dát, ktoré nie sú inicializované, .CONST určuje začiatok segmentu pre dátové konštanty. CONST segment má nastavený atribút READONLY.

Direktíva .MODEL musí predchádzať týmto direktívam.

Na záver si ukážeme dva jednoduché príklady. Výsledkom programov bude zobrazenie MessageBoxu na obrazovke. Všimnite si však tvar zápisu programov. Programy preložíte takto: spustite program Qeditor.exe, vložte zdrojový kód a v menu Project vyberte voľbu Build All. Ak ste pri opisovaní neurobili chybu, výsledkom bude execute súbor. Nabudúce sa budeme venovať opisu uvedených príkladov.

;program 01 - Assembler pod Windows - PC Revue

      .386

      .model flat, stdcall

       option casemap : none

      include c:\masm32\include\windows.inc

      include c:\masm32\include\user32.inc

      include c:\masm32\include\kernel32.inc

      includelib c:\masm32\lib\user32.lib

      includelib c:\masm32\lib\kernel32.lib

.data

lpCaption     db "Hello, world!",0

lpText        db "Assembler pod Windows"

              db 10,13,3 DUP (32)

              db "PC REVUE 12/2000"

              db 10,13,10,13,5 DUP (32)

              db "HELLO, WORLD!",0

.code

start:  push MB_OK

        push offset lpCaption

        push offset lpText

        push 0

        call MessageBox

        push 0

        call ExitProcess

end start

 

;program 02 - Assembler pod Windows - PC Revue

      .386

      .model flat, stdcall

       option casemap : none

      include c:\masm32\include\windows.inc

      include c:\masm32\include\user32.inc

      include c:\masm32\include\kernel32.inc

           includelib c:\masm32\lib\user32.lib

      includelib c:\masm32\lib\kernel32.lib

.code

start:  jmp run

lpCaption     db "Hello, world!",0

lpText        db "Assembler pod Windows"

              db 10,13,3 DUP (32)

              db "PC REVUE 12/2000"

              db 10,13,10,13, 5 DUP (32)

              db "HELLO, WORLD!",0

run:    invoke MessageBox,NULL,ADDR lpText,ADDR lpCaption,MB_OK

        invoke ExitProcess,NULL

end start


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá