SEGDEF:98 07-00 60 1B 00 02 01 01 E2Il macello sta nel fatto che c'è un campo formato da una serie di lunghezza variabile di bytes che esprimono gli attributi del segmento.
Nella fattispecie abbiamo un byte che vale 60.
Lo scrivo in binario:
01100000Andiamo per ordine:
Il primo sottocampo è di tre bytes, e vale 011, ossia 3.
Questo è il campo dell'ALIGNMENT del segmento, che può avere i seguenti valori:
- 0: segmento assoluto (non ricordo più cosa significa)
- 1: segmento allineato al byte
- 2: segmento allineato alla word
- 3: segmento allineato al paragrafo
- 4: segmento allineato alla pagina
- 5: segmento allineato alla doubleword
Acquisito questo, adesso mi metto a giocare creando segmenti variamente allineati e vedere come varia questo byte.
Anzi parto dall'intenzione di volere un certo valore di questo byte e vediamo se ci riesco variando il sorgente.
Adesso il sottocampo dovrà essere 1, quindi il byte sarà 20.
dati segment byte
dato1 dw 1234h
dato2 dw 5678h
dati ends
text segment
assume cs:text,ds:dati
inizio:
mov ah,00h
mov al,03h
int 10h
mov ah,00h
int 16h
mov ah,4ch
int 21h
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 20
Bene!
Adesso il sottocampo dovrà essere 2, quindi il byte sarà 40.
dati segment word
dato1 dw 1234h
dato2 dw 5678h
dati ends
text segment
assume cs:text,ds:dati
inizio:
mov ah,00h
mov al,03h
int 10h
mov ah,00h
int 16h
mov ah,4ch
int 21h
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 40
Ottimo.
Adesso specifichiamo l'allineamento al paragrafo così da trasformare il byte in 60.
Ho capito che l'allineamento di default dei segmenti è al paragrafo.
dati segment para
dato1 dw 1234h
dato2 dw 5678h
dati ends
text segment
assume cs:text,ds:dati
inizio:
mov ah,00h
mov al,03h
int 10h
mov ah,00h
int 16h
mov ah,4ch
int 21h
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 60
Perfetto!
Adesso il sottocampo sarà 4, quindi il byte sarà 80.
dati segment page
dato1 dw 1234h
dato2 dw 5678h
dati ends
text segment
assume cs:text,ds:dati
inizio:
mov ah,00h
mov al,03h
int 10h
mov ah,00h
int 16h
mov ah,4ch
int 21h
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 80
Benissimo!
Adesso il sottocampo sarà 5, quindi il byte sarà A0.
dati segment dword
dato1 dw 1234h
dato2 dw 5678h
dati ends
text segment
assume cs:text,ds:dati
inizio:
mov ah,00h
mov al,03h
int 10h
mov ah,00h
int 16h
mov ah,4ch
int 21h
text ends
end inizio
80 0A 00 08 6D 69 6F 32-2E 61 73 6D 88 96 0C 00
00 04 54 45 58 54 04 44-41 54 49 EF 98 07 00 A0
Perfetto!!!
Nessun commento:
Posta un commento