JavascriptProva

Visualizzazione post con etichetta librerie. Mostra tutti i post
Visualizzazione post con etichetta librerie. Mostra tutti i post

sabato 21 settembre 2013

Un BAT per assemblare e linkare in un attimo

Mi costruisco un "pipistrello" per l'assemblaggio e il linkaggio, roba di due minuti, perfezionando esegui.bat.
@echo off
ml /c /Zm %1.asm
link %1,,nul,%2,,
Perfetto! Così mi basta inserire il nome del sorgente e quello della libreria per ottenere tutto immediatamente.

c:\Assembly>dir uno*
 Il volume nell'unità C non ha etichetta.
 Numero di serie del volume: ECE6-4560

 Directory di c:\Assembly

21/09/2013  12.34               500 uno.asm
               1 File            500 byte
               0 Directory  12.490.698.752 byte disponibili

c:\Assembly>esegui uno,libreria
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: uno.asm

Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.


c:\Assembly>dir uno*
 Il volume nell'unità C non ha etichetta.
 Numero di serie del volume: ECE6-4560

 Directory di c:\Assembly

21/09/2013  12.34               500 uno.asm
21/09/2013  12.44             1.600 uno.exe
21/09/2013  12.44               153 uno.obj
               3 File          2.253 byte
               0 Directory  12.490.694.656 byte disponibili

c:\Assembly>
Perfetto!

venerdì 20 settembre 2013

Uso di procedure in libreria.

Adesso veniamo a una procedura, quella che ho già chiamato X, per perfezionarla...

Diversamente dalle altre che ho già "impacchettato", questa procedura necessita della preparazione di alcuni registri prima di essere chiamata.

Ho già fatto in modo che il valore in AL, in cui va messo il carattere da stampare, sia preparato prima, e adesso devo fare in modo che anche BL, in cui va messo il colore, sia trattato nello stesso modo. La rinomino "stampa".
public stampa
text segment byte public

stampa proc near
 mov ah,09h
 mov bh,00h
 mov cx,1
 int 10h
 ret
stampa endp

text ends
end
Eseguo il solito "impacchettamento"
c:\Assembly>esegui stampa
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: stampa.asm
MASM : fatal error A1000: cannot open file : stampa.asm

c:\Assembly>esegui stampa
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: stampa.asm

c:\Assembly>lib libreria + stampa

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

List file:
Output library:

c:\Assembly>
c:\Assembly>lib libreria

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

Operations:
List file: con
CANCELLA..........cancella          KEYWAIT...........KeyWait
STAMPA............stampa            X.................proced


proced            Offset: 00000010H  Code and data size: cH
  X

cancella          Offset: 00000070H  Code and data size: 7H
  CANCELLA

KeyWait           Offset: 000000d0H  Code and data size: 5H
  KEYWAIT

stampa            Offset: 00000130H  Code and data size: aH
  STAMPA

c:\Assembly>
(esegui è un file BAT che ho costruito per assemblare senza stare a ripetere gli switch ogni volta)

Bene.
Adesso uso il ptogramma principale con queste procedure.
extrn Cancella:near
extrn Stampa:near
extrn KeyWait:near
;definiamo il segmento
text segment public
;inizio del programma
start:
 call Cancella
 
 mov al,'A'
 mov bl,0Ch
 call Stampa
 
 call KeyWait
 
 mov ah,4ch
 int 21H

text ends

stack segment para stack
 db 1024 dup(00H)

stack ends

end start
 
E funziona benissimo!

Creazione di procedure e immissione in libreria.

Ecco, i dati.
Nei modelli di Giobe i dati sono compresi fra l'inizio del programma principale e l'indirizzo cui si salta partendo dall'inizio.
Prima però mi ricostruisco le procedure e le metto nella libreria.
public Cancella
text segment byte public
Cancella proc near
 mov ah,00h
 mov al,03h
 int 10h
 ret
Cancella endp
text ends
end


c:\Assembly>esegui cancella
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: cancella.asm

c:\Assembly>lib libreria+cancella

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

List file:
Output library:

c:\Assembly>
c:\Assembly>lib libreria

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

Operations:
List file: con
CANCELLA..........cancella          X.................proced


proced            Offset: 00000010H  Code and data size: cH
  X

cancella          Offset: 00000070H  Code and data size: 7H
  CANCELLA

c:\Assembly>

public KeyWait
text segment byte public
KeyWait proc near
mov ah,00h
int 16h
ret
KeyWait endp
text ends
end
c:\Assembly>lib libreria+KeyWait

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

List file:
Output library:

c:\Assembly>lib libreria

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

Operations:
List file: con
CANCELLA..........cancella          KEYWAIT...........KeyWait
X.................proced

proced            Offset: 00000010H  Code and data size: cH
  X

cancella          Offset: 00000070H  Code and data size: 7H
  CANCELLA

KeyWait           Offset: 000000d0H  Code and data size: 5H
  KEYWAIT

c:\Assembly>


Ecco...

giovedì 19 settembre 2013

Ripasso librerie in assembly

Ho ripassato le procedure esterne NEAR (ossia facenti parte dello stesso segmento).
Ecco i due sorgenti, quello del programma principale e quello di una procedura esterna:
extrn X:near
;definiamo il segmento
text segment public
;inizio del programma
start:
 mov ah,00h
 mov al,03h
 int 10h
 
 mov al,'X'
 call X
 
 mov ah,00h
 int 16h
 
 mov ah,4ch
 int 21H

text ends
end start
 
public X
text segment public

X proc near
 
 mov ah,09h
 mov bh,00h
 mov bl,0ch
 mov cx,1
 int 10h
 ret
X endp
text ends
end
assemblo e linko insieme l'uno e l'altro:

c:\Assembly>ml /Zm /c uno.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: uno.asm

c:\Assembly>ml /Zm /c proced.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: proced.asm

c:\Assembly>link uno proced

Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.

Run File [uno.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment

c:\Assembly>
e funziona:
X
c:\Assembly>

Adesso, invece di linkare due files oggetto insieme uso una libreria:
Costruisco una libreria.

c:\Assembly>lib libreria

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

Library does not exist.  Create? (y/n) y
Operations:
List file:

c:\Assembly>dir libreria*
 Il volume nell'unità C non ha etichetta.
 Numero di serie del volume: ECE6-4560

 Directory di c:\Assembly

20/09/2013  00.31             1.033 libreria.lib
               1 File          1.033 byte
               0 Directory  12.002.516.992 byte disponibili

c:\Assembly>
Adesso ci agginugo il file oggetto proced.obj.
Troviamolo...
c:\Assembly>dir proced*
 Il volume nell'unità C non ha etichetta.
 Numero di serie del volume: ECE6-4560

 Directory di c:\Assembly

19/09/2013  22.07               137 proced.asm
20/09/2013  00.33                77 proced.obj
               2 File            214 byte
               0 Directory  12.002.582.528 byte disponibili

c:\Assembly>
Eccolo!
Aggiungiamolo:
c:\Assembly>lib libreria + proced

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

List file:
Output library:

c:\Assembly>
Leggiamo la libreria per vedere se contiene la procedura:
c:\Assembly>lib libreria

Microsoft (R) Library Manager  Version 3.40
Copyright (C) Microsoft Corp 1983-1993.  All rights reserved.

Operations:
List file: con
X.................proced

proced            Offset: 00000010H  Code and data size: cH
  X

c:\Assembly>
Perfetto!