Téglalap kiírása

Téglalap kiírása
2014-05-20T16:45:53+02:00
2014-05-21T21:10:13+02:00
2022-08-17T23:00:33+02:00
Ampulla
Sziasztok! Egy nagyon egyszerű program ám mégse látom mi lehet a hiba. Szóval a feladat: bekérek 2 számot és kiírja a megfelelő téglalapot. Pl.: 2 3
xxx
xxx

org 100h MOV AH, 9 MOV DX, msg INT 21h ujra: MOV AH, 1 INT 21h ;ellenorzes hogy szam-e CMP AL,'0' JB hiba CMP AL,'9' JA hiba MOV BL, AL INT 21h ;ellenorzes hogy szam-e CMP AL,'0' JB hiba CMP AL,'9' JA hiba SUB BL, '0' ;szamma alakitas SUB AL, '0' XOR CX,CX ;CX kitisztitasa sor: CMP BL, '0' JE vege ; vizsgaljuk a ciklusvaltozo erteket MOV CL,AL ; ujratoltjuk a CX valtozot, hogy megint le tudjon futni MOV AH,2 MOV DL,'X' ;Betoltjuk a X-et a DL, be hogy ezt nyomtassa ki kiir: INT 21h ;kinyomtatas loop kiir MOV AH,9 ;sortores MOV DX, newline INT 21h DEC BL ; csokkentjuk a BL erteket JMP sor vege: INT 20h ;program megszakitas hivjuk meg mert ujra rafutunk a hibara! hiba: MOV AH, 9 MOV DX, err_msg INT 21h JMP ujra err_msg: db 'Hibas adat $' msg: db 'Adja meg a sorok! es az oszlopok szamat! $'
newline: db 10, 13, '$'

Köszönöm.
Mutasd a teljes hozzászólást!
bár nagyon rég találkoztam asm-mel, de:

sor: CMP BL, '0'
miért, ha már számmá van alakítva?

Mit csinál a program? Hogyan száll el?
Mutasd a teljes hozzászólást!

  • Kiír egy egy egy sorba kb 30 X-et aztán csinál egy sortörést és ezt kb 50-szer ismétli. Szóval egy extranagy téglalapot hoz léte. Mindegy mekkora számot írok neki.

    a SUB AL,0 -at és ne tudom így van benne a Tanárom jegyzetébe.
    Mutasd a teljes hozzászólást!
  • Ez mi szeretne lenni?

    MOV DX, newline
    Mutasd a teljes hozzászólást!
  • Mivel utána meghívja az int 21h-t, ezért értelemszerűen kiír egy newline-t.

    @Ampulla
    Egyébként szerintem is a CMP BL, '0' sorral lesz a gond. Így lényegében 0x30r-a ellenőrzöd a BL-t, ami meg valsz ritkán áll fent.

    Ettől a résztől eltekintve szerintem rendben van az egész.
    Mutasd a teljes hozzászólást!
  • Az új kinézet miatt nem lehet észrevenni De ott van:

    newline: db 10, 13, '$'
    Mutasd a teljes hozzászólást!
  • Köszönöm a válaszokat. Igen valóban az volt a hiba, aposztrógok nélkül kell összehasonlítani. 
    Balázs volt az első, így Övé a pont.
    Mutasd a teljes hozzászólást!
  • Ja most látom: Én csak az src box-ban levőt húztam át, a newline meg azon kívülre került, így hiányzott a szerkesztőmből.
    Mutasd a teljes hozzászólást!
  • Elnézést, véletlenül kimaradt az az 1 sor. 
    Mutasd a teljes hozzászólást!
  • heló
    csak a móka kedvéért és hogy hibázhassak :)

    
    org 100h
      MOV AH, 9 ; azt mondjuk ay int21/nek, hogy kiiras lesz
      MOV DX, msg ; betoltjuk az uzenet kezdopointeret a DX/be
      INT 21h ; kerunk egy megszakitast ( AH==9, tehat kiiras)
     ujra:
      MOV AH, 1 ; azt mondjuk int21-nek, hogy beolvasunk 1 karaktert
      INT 21h ;ellenorzes hogy szam-e ; bekerjuk a karaktert AL-be
      CMP AL,'0' ;Al/t teszteljuk  '0'-ra
      JB hiba ; ha kissebb, akkor hiba
      CMP AL,'9' ; tesztelunk '9'-re
      JA hiba ; ha nagyobb akkor hiba
      MOV BL, AL ;BL-be AL
      INT 21h ;ellenorzes hogy szam-e ;a kovetkezo szamot is bekerjuk
      CMP AL,'0' ;lasd fent
      JB hiba
      CMP AL,'9'
      JA hiba
      SUB BL, '0' ;szamma alakitas ;kivonjuk BL-bol '0' ascii kodjat, igy szamot kapunk
      SUB AL, '0' ;szinten szamma alakitas
      XOR CX,CX ;CX kitisztitasa ; XOR=kizaro vagy
     sor:
      CMP BL, '0' ;itt a hiba a jo: CMP BL,0; 0-ra tesztelunk
      JE vege ; vizsgaljuk a ciklusvaltozo erteket ;ha egyenlo akkor vege
      MOV CL,AL ; ujratoltjuk a CX valtozot, hogy megint le tudjon futni 
      MOV AH,2 ; AH-ba 2, hogy int21 egy karakter irjon ki
      MOV DL,'X' ;Betoltjuk a X-et a DL, be hogy ezt nyomtassa ki
      kiir:
      INT 21h ;kinyomtatas
      loop kiir
      MOV AH,9 ;sortores 
      MOV DX, newline
      INT 21h ;kiiras
      DEC BL ; csokkentjuk a BL erteket
     JMP sor ; vissza a sorhoz
     vege:
     INT 20h ;program megszakitas hivjuk meg mert ujra rafutunk a hibara!
     hiba:
      MOV AH, 9 ;int21-be kiiras
      MOV DX, err_msg ;uzenet
      INT 21h ;megszakitas
      JMP ujra ;vissza
     err_msg: db 'Hibas adat $'
     msg: db 'Adja meg a sorok! es az oszlopok szamat!
    $'

    érdemes elolvasni:
    DOS Interrupts
    A karakter CMP-k a karakterek ascii kódjára vonatkoznak: ASCII - Wikipédia
    amikor azt mondod, hogy:
    mov al,'0'
    akkor al-be 30 kerül.
    ha azt, hogy mov al,'1'
    akkor 31

    éppen ezért, ha al-ben '1' van (31), akkor
    sub al,'0' után al-ben 1-  lesz. Így lesz a karakterből szám.

    remélem tudtam segíteni.
    Mutasd a teljes hozzászólást!
abcd