Ik heb laatst besloten dat ik Assembly wil gaan begrijpen, en heb dus gezocht naar enkele sites met handleidingen, zeer interresante gevonden. Ook gelezen. Maar, er is geen betere leerschool als de practijk. Dus besloot ik simpel te beginnen.
Dit testprogramma zou alle tekens van de ASCII tekenset moeten weergeven:
Maar deze werkt niet, laat maar twee karakters zien, een leege en het witte hoofdje.
Als ik de variabellen in de bovenstaande code vervang door hun waarde, dan werkt hij wel zoals ik wil:
Nou heb ik ze beide gedeassembleerd via ndisasmw, maar dan krijg ik twee zeer afwijkende listings (van elkaar dan):
Heeft iemand een idee waardoor dit veroorzaakt word?
*offtopic
Is het mischien niet een idee om links toe te voegen aan het Assembly gedeelte zoals:
http://webster.cs.ucr.edu/AoA/DOS/AoADosIndex.html
http://webster.cs.ucr.edu/AoA/Windows/HTML/AoATOC.html
http://webster.cs.ucr.edu/AoA/Linux/HTML/AoATOC.html
http://webster.cs.ucr.edu/AsmTools/NASM/pcasm-book.pdf
Dit testprogramma zou alle tekens van de ASCII tekenset moeten weergeven:
GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| bits 16 ; 16 bits code bBegin db, 00h bEnd db, 7Fh bStep db, 01h mov bx, 07h ; bh = 0 (paginanummer), bl = 7 (tekstkleur) mov ah, 0Eh ; int 10, E mov al, bBegin ; al: Af te drukken karakter call _loop ; ga naar de loop halt ; stop uitvoering _loop: int 10h ; roep interrupt 10 aan add al, bStep ; voeg aan al de waarde van step toe cmp al, bEnd ; vergelijk al met de te bereiken eindwaarde jae .endloop ; waardes geleik of al > eind: ga naar endloop jmp _loop ; terug naar begin van de loop .endloop: ret ; terug naar waar de call vandaan kwam |
Maar deze werkt niet, laat maar twee karakters zien, een leege en het witte hoofdje.
Als ik de variabellen in de bovenstaande code vervang door hun waarde, dan werkt hij wel zoals ik wil:
GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| bits 16 ; 16 bits code mov bx, 07h ; bh = 0 (paginanummer), bl = 7 (tekstkleur) mov ah, 0Eh ; int 10, E mov al, 00h ; al: Af te drukken karakter call _loop ; ga naar de loop halt ; stop uitvoering _loop: int 10h ; roep interrupt 10 aan add al, 01h ; voeg aan al de waarde van step toe cmp al, 7Fh ; vergelijk al met de te bereiken eindwaarde jae .endloop ; waardes geleik of al > eind: ga naar endloop jmp _loop ; terug naar begin van de loop .endloop: ret ; terug naar waar de call vandaan kwam |
Nou heb ik ze beide gedeassembleerd via ndisasmw, maar dan krijg ik twee zeer afwijkende listings (van elkaar dan):
GAS:
1
2
3
4
5
6
7
8
9
10
11
| {werkend} mov bx,0x7 mov ah,0xe mov al,0x0 call 0xa int 0x10 add al,0x1 cmp al,0x7f jnc 0x15 jmp 0xa ret |
GAS:
1
2
3
4
5
6
7
8
9
10
11
12
| {niet werkend} add [bx+0x1],bh mov bx,0x7 mov ah,0xe mov al,0x0 call 0xd int 0x10 add al,0x2 cmp al,0x1 jnc 0x18 jmp 0xd ret |
Heeft iemand een idee waardoor dit veroorzaakt word?
*offtopic
Is het mischien niet een idee om links toe te voegen aan het Assembly gedeelte zoals:
http://webster.cs.ucr.edu/AoA/DOS/AoADosIndex.html
http://webster.cs.ucr.edu/AoA/Windows/HTML/AoATOC.html
http://webster.cs.ucr.edu/AoA/Linux/HTML/AoATOC.html
http://webster.cs.ucr.edu/AsmTools/NASM/pcasm-book.pdf
[ Voor 8% gewijzigd door Verwijderd op 11-05-2004 21:53 ]