Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
Autor | Správa |
---|
Registrovaný: 16.05.09 Prihlásený: 17.05.09 Príspevky: 3 Témy: 1 | 1 |
caute...potrebujem help s programom na assembler 8086 a kompilaciou cez tasm...
program ma vypisat peknu pyramidu hviezdiciek so zakladnou ktoru si zadame na zaciatku...no nejako to nerobi...vypisuje ze pointer or offset is 32 bit. tu je zdrojak
Kód: .model SMALL .stack 100
.data
sprava1 db 'Zadaj cislo od 1 do 9:$' crlf db 13,10,'$'
.code
start: mov ax,cs mov ds,ax
int 10h
mov ah,9 mov dx,offset sprava1 ; int 21h
rpt: xor ax,ax int 16h
cmp ah,2 ;citanie alfanumerickej casti - klavesy pod escape, 1, 2, 3 jb rpt cmp ah,0Ah ;citanie scan kodu az po 9 ja rpt
mov al,0
mov ah,9 mov dx,offset crlf ;novy riadek int 21h
dec ah ;1-9 xor al,al mov cl,ah xor ch,ch ;cx = od 1 do 9 mov ax,1 ;vycisti registre :D
kresli: push ax push cx mov cx,ax mov ah,0Ah mov al,'*' int 10h pop cx pop ax cmp ax,cx je konec
mov ah,09h mov dx,offset crlf int 21h
inc ax jmp kresli
konec:
mov ah,09h mov dx,offset crlf int 21h xor ax,ax int 16h mov ah, 4Ch int 20h
end start
program ide skompilovat ale vobec nevypise co ma ani pyramidu len nejake hakybaky...no ved skuste si to niekto skompilovat cez tasm a sami uvidite...pomozete mi s tym pls?co tam zmenit aby to slo spravne?
|
|
Registrovaný: 11.01.09 Prihlásený: 08.01.25 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Neskúšal som to kompilovať, ale všimol som pár chýb:
1.)
Kód: cmp ah, 2 ;citanie alfanumerickej casti - klavesy pod escape, 1, 2, 3 jb rpt cmp ah, 0Ah ;citanie scan kodu az po 9 ja rpt
mov al, 0
mov ah, 9 mov dx, offset crlf ;novy riadek int 21h
dec ah ;1-9 V registri AH ukladáš číslo zo vstupu (po prerušení int 16h). Následne použiješ prerušenie int 21h, pričom do AH umiestniš 9 ==> základňa sa vždy rovná ôsmim (po inštrukcii dec ah). 2.) To isté sa deje aj tu: Kód: mov cx,ax mov ah, 0Ah mov al, '*' int 10h pop cx pop ax cmp ax, cx je konec
mov ah, 09h mov dx, offset crlf int 21h
inc ax jmp kresli
Pri prvom prejdení je v prvom riadku tohto výpisu správne číslo (teda ak neberieme v úvahu, že je tam stále 8 ). No potom voláš prerušenie int 21h a v ax je 0901h (podľa návratovej hodnoty int 21h) ==> nakreslí ti toľko hviezdičiek, koľko je v AX.
Riešenie:
Vždy dozeraj na registre, či ich náhodou následovným kódom nemeníš. A ak ti môžem poradiiť, nerob to cez int 10h, teda pomocou grafického režimu (v prípade, že to nie je nevyhnutné). Je to zbytočne komplikované na to, že to iba kreslí hviezdičky.
|
|
Registrovaný: 16.05.09 Prihlásený: 17.05.09 Príspevky: 3 Témy: 1 | 1 |
hmm velmi nechapem...mozes to prekodit nejako aby to fungovalo?totizto ked ten program prepisem do FASM...co je ale procesor i80 a ja potrebujem i86...vymazem offset a dam org proste to editujem do tejto podoby
Kód: org 100h jmp start
sprava1 db 'Zadaj cislo od 1 do 9:$' crlf db 13,10,'$'
start: mov ax,cs ;datovy segment = segment kodu mov ds,ax mov es,ax
mov ax,03 ;nastav 80x25 int 10h
mov ah,9 mov dx,sprava1 ;(alebo "mov dx,offset sprava1" pre TASM) int 21h
rpt: xor ax,ax int 16h
cmp ah,2 ;citanie alfanumerickej casti - klavesy pod escape, 1, 2, 3 jb rpt cmp ah,0Ah ;citanie scan kodu az po 9 ja rpt
mov al,0 ;kasli na ascii kod
pusha mov ah,9 mov dx,crlf ;novy riadek int 21h popa
dec ah ;1-9 xor al,al mov cl,ah xor ch,ch ;cx = od 1 do 9 mov ax,1 ;vycisti registre :D
kresli: push ax push cx mov cx,ax mov ah,0Ah mov al,'*' int 10h pop cx pop ax cmp ax,cx je konec pusha mov ah,09h mov dx,crlf int 21h popa inc ax jmp kresli
konec: ;;;konec. cakaj na lubovolnu klavesu a ukonci mov ah,09h mov dx,crlf int 21h xor ax,ax int 16h int 20h ;konec v DOS COM, v exe daj mov ah, 4Ch int 21h
tak mi to setko ide...cize zadam napr 5 a vypise toto
*
**
***
****
*****
no a toto potrebujem len v TASM
|
|
Registrovaný: 11.01.09 Prihlásený: 08.01.25 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
No, pravdupovediac, ja ti nerozumiem
Tak do FASM si to vieš napísať, aby ti to šlo, ale do TASM to neprepíšeš? Všimni si zmeny v tvojom prvom kóde a v tomto predchádzajúcom. Vieš prečo to funguje?
Kód: pusha ... popa
Register AX uložíž do zásobníka, čím predídeš strátam dát. Riešenie pre TASM: Kód: .MODEL small .STACK 100h
.DATA
sprava1 db 'Zadaj cislo od 1 do 9:$' crlf db 13,10,'$'
.CODE
start: mov ax,@data ;datovy segment = segment kodu mov ds,ax mov es,ax
mov ax,03 ;nastav 80x25 int 10h
mov ah,9 lea dx, sprava1 ;(alebo "mov dx,offset sprava1" pre TASM) int 21h
rpt: xor ax,ax int 16h
cmp ah,2 ;citanie alfanumerickej casti - klavesy pod escape, 1, 2, 3 jb rpt cmp ah,0Ah ;citanie scan kodu az po 9 ja rpt
mov al,0 ;kasli na ascii kod
pusha mov ah,9 lea dx, crlf ;novy riadek int 21h popa
dec ah ;1-9 xor al,al mov cl,ah xor ch,ch ;cx = od 1 do 9 mov ax,1 ;vycisti registre :D
kresli: push ax push cx mov cx,ax mov ah,0Ah mov al,'*' int 10h pop cx pop ax cmp ax,cx je konec pusha mov ah,09h lea dx,crlf int 21h popa inc ax jmp kresli
konec: ;;;konec. cakaj na lubovolnu klavesu a ukonci
mov ah,09h lea dx,crlf int 21h
xor ax,ax int 16h
mov ax, 4C00h int 21h
end start
|
|
Registrovaný: 16.05.09 Prihlásený: 17.05.09 Príspevky: 3 Témy: 1 | 1 |
velmi pekne dakujem
|
|
Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
|