Toon posts:

[MASM] Problemen met variabel in een lus

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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 ]


  • raoulduke
  • Registratie: Oktober 2003
  • Niet online

raoulduke

Get in!

Refereer je die 'variabelen' wel als variabelen niet als geheugenadressen? Ik kan me voorstellen dat je zeg maar nu het geheugenadres gebruikt in plaats van de waarde van een enkele byte op die geheugenlocatie. Dat zal allicht het probleem zijn.

Remember, if you have any trouble you can always send a telegram to the Right People.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

code:
1
2
3
bBegin    db, 00h
bEnd    db, 7Fh
bStep    db, 01h


dat moet je niet in je code sectie stoppen, dan ziet ie het als code en dat gaat dus 99 van de 100 keer mis :)
En met de halt instructie stop je niet je programma

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Heb de code aangepast, en hij doet nu een paar dingen fout: hij tekent niet ASCII 0 tot en met 127. Maar, hij tekent dit:
code:
1
2
3
4
  _²³¹·š°ž÷§¶Ÿ_±­Ž¯ÝýÙÛÚÞþµÕõÒÔßÓ_ÌŜ__++ÏÎÍiÈËÊÐð€+-Ŝ--++Ãã+-+--++¥¢++ŜŜ©ÀÂÁŜŜ
___»«¡Œœ¬®¿ºªÑñúóíáƒ×Ø£øÜÖÿùûòöôÆæÉÅÄìîïèëêçåàäâéüÇ~}|{zyxwvutsrqponmlkjihgfedc
ba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! §¶
€


Er zit dus ergens een fout: hij trekt af en, in het begin rommelt hij helemaal.

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bits 16

segment .data
    bBegin db   00h
    bEnd   db   7Fh
    bStep  db   01h

segment .text
    mov    bx,  07h
    mov    ah,  0Eh
    mov    al,  [bBegin]
    call   _loop
    end

    _loop:
        int    10h
        add    al, [bStep]
        cmp    al, [bEnd]
        je     .endloop
        jmp    _loop

        .endloop:
            ret


(deze keer niet alle opmerkingen, die zijn vrijwel gelijk gebleven :))

[ Voor 7% gewijzigd door Verwijderd op 11-05-2004 22:22 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmm, erg vaag, ik zie niet echt iets fouts aan je code. Het enige dat ik me voor kan stellen is dat je data niet klopt, of dat ie het niet uit de goede geheugenlocatie leest.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
De data klopt zeker, het is namelijk dezelfde data als dat hij krijgt gegeven als ik deze data direct in de code neerzet. Het zal wel aan de geheugenlocatie liggen:

debug.exe:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
C:\>debug TEST.COM
-u
0F9F:0100 BB0700        MOV     BX,0007
0F9F:0103 B40E          MOV     AH,0E
0F9F:0105 A01C00        MOV     AL,[001C]
0F9F:0108 E80000        CALL    010B
0F9F:010B CD10          INT     10
0F9F:010D 02061E00      ADD     AL,[001E]
0F9F:0111 3A061D00      CMP     AL,[001D]
0F9F:0115 7303          JNB     011A
0F9F:0117 E9F1FF        JMP     010B
0F9F:011A C3            RET
0F9F:011B 0000          ADD     [BX+SI],AL
0F9F:011D 7F01          JG      0120
0F9F:011F E280          LOOP    00A1
-d 0f9f:001c
0F9F:0010                                      02 FF FF FF               ....
0F9F:0020  FF FF FF FF FF FF FF FF-FF FF FF FF 87 0F 4C 01   ..............L.
0F9F:0030  02 0D 14 00 18 00 9F 0F-FF FF FF FF 00 00 00 00   ................
0F9F:0040  07 0A 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0F9F:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20   .!...........
0F9F:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20           .....
0F9F:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00           ........


Waar de waardes voor bStep, bEnd en bBegin zouden moeten staan staat dus alleen maar FF (dus of 255 of -1). Ik denk zelf dat hij -1 neemt omdat hij de waardes op ten duur ook begint terug te tellen in de ASCII tabel. (In het gedeelte van wat hij wel als gegevens met verband uitvoert.)

Vraagt zich sterk af wat hij in zijn allereerste keer te programmeren in Assembly verkeert aan het doen is :s

[ Voor 7% gewijzigd door Verwijderd op 12-05-2004 21:17 ]


  • silentsnow
  • Registratie: Maart 2001
  • Laatst online: 15-04-2013

silentsnow

« '-_-' »

Ik ben niet thuis in MASM, geef mij maar TASM. Veel makkelijker :)
Probeer dit eens:

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bits 16

segment .data
         bBegin   db 00h
         bEnd     db 7Fh
         bStep    db 01h

segment  .text
         mov      bx, 07h
         mov      ah, 0Eh
         mov      al, [bBegin]
_loop:   int      10h
         add      al, [bStep]      ;kan je vervangen door "inc al"
         cmp      al, [bEnd]
         jne       _loop
         end

The trade of the tools
[ me | specs ] Klipsch Promedia Ultra 5.1 + Sennheiser HD-590


Verwijderd

Zelf ben ik ook een TASM man, maar je code lijkt ok.
Een opmerking: deze interrupt interpreteert ASCII codes 7, 8, A en D als control codes, dus die kun je niet printen.
Zie ook http://www.ctyme.com/intr/rb-0106.htm

Edit: Het is lang geleden, maar gaat er niet iets fout met je code en data segmenten? Moet je DS niet naar CS laten wijzen?

[ Voor 22% gewijzigd door Verwijderd op 13-05-2004 08:52 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 12 mei 2004 @ 21:16:
De data klopt zeker, het is namelijk dezelfde data als dat hij krijgt gegeven als ik deze data direct in de code neerzet. Het zal wel aan de geheugenlocatie liggen:

debug.exe:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
C:\>debug TEST.COM
-u
0F9F:0100 BB0700        MOV     BX,0007
0F9F:0103 B40E          MOV     AH,0E
0F9F:0105 A01C00        MOV     AL,[001C]
0F9F:0108 E80000        CALL    010B
0F9F:010B CD10          INT     10
0F9F:010D 02061E00      ADD     AL,[001E]
0F9F:0111 3A061D00      CMP     AL,[001D]
0F9F:0115 7303          JNB     011A
0F9F:0117 E9F1FF        JMP     010B
0F9F:011A C3            RET
0F9F:011B 0000          ADD     [BX+SI],AL
0F9F:011D 7F01          JG      0120
0F9F:011F E280          LOOP    00A1
-d 0f9f:001c
0F9F:0010                                      02 FF FF FF               ....
0F9F:0020  FF FF FF FF FF FF FF FF-FF FF FF FF 87 0F 4C 01   ..............L.
0F9F:0030  02 0D 14 00 18 00 9F 0F-FF FF FF FF 00 00 00 00   ................
0F9F:0040  07 0A 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0F9F:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20   .!...........
0F9F:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20           .....
0F9F:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00           ........
Ik zie het al :)
De assembler denkt dat de code begint vanaf adres 0000h. Maar dat is niet zo, een COM programma start altijd op 0100h. Je moet je assembler dus duidelijk maken dat het begin adres 0100h, meestal kan dat met de ORG directive (in NASM iig, geen idee hoe het zit met MASM), die moet je gewoon onder je "bits 16" zetten.

Je kan het ook zien, als je kijkt naar de opcodes van de instructies op de adressen 011Ch, 011Dh en 011Eh, dan zie je daar ook resp. de waarden, 0, 7Fh en 1. Alleen in plaats van die te lezen, leest hij 001Ch en verder, omdat hij denkt dat het vanaf 0 begint ipv vanaf 0100h

[ Voor 19% gewijzigd door .oisyn op 14-05-2004 18:13 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1