Stránka: 1 z 1
| [ Príspevkov: 7 ] | |
| Autor | Správa |
|---|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 | 34 Bydlisko: IP: 209.85.... |
Caute, mam problem najst minimum a maximum v zadanej postupnosti cisel. Funguje mi to pre kladne cisla, ale akonahle zmenim niektore cislo za zaporne, tak to nejde. A chcem to spravit tak, ze v postupnosti budu zaporne aj kladne cisla, program najde min, max a vypise. Bolo by fajn, keby to vypisalo aj index minima, maxima.
Kód: ;Definujte postupnost celych cisel <-32768; 32768> ;Najdite minimum & maximum, vypiste ich na obrazovku s indexom
.MODEL small .STACK 100h .DATA cislo DB 6,7 dup (?) ;alokacia, max 6 pole DW 1, 10, 100, 1000, 10000 ;definicia postupnosti (pola) Dlzka EQU $-Pole ;EQU znamena const, .CODE .386
Read PROC ;vystupny parameter ax mov dx, offset cislo mov bx, offset cislo mov di, 2 mov ah, 0Ah int 21h mov ah, 2 mov dl, 0Ah int 21h mov ax, 0 mov dx, 0
konverzia: mov cl, [bx + di] cmp cl, 0dH jz inicializacia and cl, 00001111b ;prevedie znak na cislo .386 imul ax, 10 mov ch, 0 add ax, cx inc di jmp konverzia inicializacia: ret Read ENDP
Write PROC ;vstupny parameter ax mov bx, offset pole mov di, 0
delenie: mov cx, 10 mov dx, 0 div cx add dl, '0' ;konverzia na ASCII kod mov [bx + di], dl inc di cmp ax, 0 jnz delenie
vypis: dec di mov dl, [bx + di] mov ah, 2 int 21h cmp di, 0 jnz vypis ;ak di sa nerovna nule, skoc na vypis
ret Write ENDP
Zac: ;Hlavny program mov ax, @data mov ds, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, 0FFFh ;do ax presunieme maximum: najvissie hexadecimalne cislo mov cx, Dlzka/2 mov di, 0 ;pocitadlo di nastavime na 0 mov bx, Offset Pole ;bx nastavime na zaciatok pola
cyklus2: cmp ax, [bx+di] ;porovnaj prvok pola s maximom jb dalej2 ;ak je prvok pola mensi ako maximum skoc na navestie dalej mov ax, [bx+di] ;inak do ax presun prvok pola dalej2: inc di inc di ;dvakrat inkrementujeme pocitadlo loop cyklus2
call Write ;zavolaj procedure write ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov dl, 0Dh int 21h mov dl, 0Ah int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, 00000h ;do ax presunieme minimum: najnizssie hexadecimalne cislo mov cx, Dlzka/2 mov di, 0 ;pocitadlo di nastavime na 0 mov bx, Offset Pole ;bx nastavime na zaciatok pola
cyklus: cmp ax, [bx+di] ;porovnaj prvok pola s minimom ja dalej ;ak je prvok pola vacsi ako minimum skoc na navestie dalej mov ax, [bx+di] ;inak do ax presun prvok pola dalej: inc di inc di ;dvakrat inkrementujeme pocitadlo loop cyklus
call Write ;zavolaj procedure write ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
koniec: mov ax, 4C00h int 21h END Zac
|
|
Registrovaný: 19.09.06 Prihlásený: 19.02.26 Príspevky: 749 Témy: 31 | 31 Bydlisko: Ružomberok&... |
kua, v com to kompilujes, skusil som uz vsetko mozne a stale mi pise nejake erory.
|
|
Registrovaný: 28.04.07 Prihlásený: 03.11.09 Príspevky: 133 Témy: 1 | 1 |
rýchly odhad - v porovnávaní musíš použiť inštrukcie pre skoky uvažujúce znamienka, tj. jg/jl namiesto ja/jb.
|
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 | 34 Bydlisko: IP: 209.85.... |
mne ten zdrojak funguje bez problemov, na kompilaciu pouzivam tasm /z a tlink /v ;len to potrebujem prerobit na zaporne cisla...ked zmenim postupnost
Kód: pole DW -1, -10, 100, 1000, 10000
a zmenim namiesto ja/jb dam jg/jl, vypise
65526
13621
ale malo by vypisat
-1
10000
ako to upravim?
|
|
Registrovaný: 28.04.07 Prihlásený: 03.11.09 Príspevky: 133 Témy: 1 | 1 |
Musíš upraviť Write tak, aby správne konvertovalo záporné čísla: 65526 je -10 interpretované ako kladné číslo. Ako sa ti tam dostalo 13621, nemám tušenia (a nemám v pláne si to kompilovať a testovať).
|
|
Registrovaný: 19.09.06 Prihlásený: 19.02.26 Príspevky: 749 Témy: 31 | 31 Bydlisko: Ružomberok&... |
v procedure write mas
Kód: mov bx,offset pole nahrad to s Kód: mov bx,offset cislo
a musis mat nahradene tie podmienene skoky a proceduru write tak ako chcel imcold,
|
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 | 34 Bydlisko: IP: 209.85.... |
uz mi to ide, stacilo pouzit podmienene skoky jnl/jl namiesto ja/jb a pri vypise v procedure Write testovat zaporne cislo pouzitim podmieneneho skoku jnl, ak je zaporne tak vypisat '-' a od 0FFFFh odpocitat dane cislo, vlastne vypiseme dvojkovy doplnok a pred neho '-'... tu je zdrojak:
Kód: ;Definujte postupnost celych cisel <-32768; 32768> ;Najdite minimum & maximum, vypiste ich na obrazovku
.MODEL small .STACK 100h; .DATA cislo DB 6,7 dup (?) ;alokacia, max 6 pole DW -10, -1, 0, 1000, 10000 ;definicia postupnosti (pola) Dlzka EQU $-Pole ;EQU znamena const, pom DW 0 .CODE .386
Write PROC ;vstupny parameter ax mov bx, offset pom mov di, 0 mov dx, 0FFFFh cmp ax,0 jnl delenie ;ak nie je mensie ako 0 skoc na navestie delenie ;inak je zaporne cislo sub dx,ax inc dx mov ax,dx push ax
mov dl, '-' mov ah, 2 int 21h pop ax
delenie: mov cx, 10 mov dx, 0 div cx add dl, '0' ;konverzia na ASCII kod mov [bx + di], dl inc di cmp ax, 0 jnz delenie
vypis: dec di mov dl, [bx + di] mov ah, 2 int 21h cmp di, 0 jnz vypis ;ak di sa nerovna nule, skoc na vypis
ret Write ENDP
Zac: ;Hlavny program mov ax, @data mov ds, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, 07FFFh ;do ax presunieme maximum: najvyssie hexadecimalne cislo mov cx, Dlzka/2 mov di, 0 ;pocitadlo di nastavime na 0 mov bx, Offset Pole ;bx nastavime na zaciatok pola
cyklus2: cmp ax, [bx+di] ;porovnaj prvok pola s maximom jl dalej2 ;ak je maximum mensie ako prvok pola skoc na navestie dalej2 mov ax, [bx+di] ;inak do ax presun prvok pola dalej2: inc di inc di ;dvakrat inkrementujeme pocitadlo loop cyklus2
call Write ;zavolaj procedure write ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov dl, 0Dh ;vypis int 21h mov dl, 0Ah ;ENTERU int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, 08000h ;do ax presunieme minimum: najnizssie hexadecimalne cislo mov cx, Dlzka/2 mov di, 0 ;pocitadlo di nastavime na 0 mov bx, Offset Pole ;bx nastavime na zaciatok pola
cyklus: cmp ax, [bx+di] ;porovnaj prvok pola s minimom jnl dalej ;ak je minimum vacsie ako prvok pola skoc na navestie dalej mov ax, [bx+di] ;inak do ax presun prvok pola dalej: inc di inc di ;dvakrat inkrementujeme pocitadlo loop cyklus
call Write ;zavolaj procedure write ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
koniec: mov ax, 4C00h int 21h END Zac
|
|
Stránka: 1 z 1
| [ Príspevkov: 7 ] | |
|