Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly ongelma

ruukie [27.02.2012 11:57:11]

#

Moro,
Pitäisi tehdä tällänen ohjelman pätkä, mikä laskee murtoluvut yhteen ja tulos sekalukuna. Tuon verran sain kasattua, mutta joku siinä klikkaa.. Pystyykö joku jeesaamaan sen verran että sais ton koodin toimivaksi?

.MODEL small	;muistimalli
.STACK 100	;pino
.DATA 		;muuttujat
teksti1 DB " Anna_1_luvun_osoittaja: $"
teksti2 DB " Anna_1_luvun_nimittaja: $"
teksti3 DB " Anna_2_luvun_osoittaja: $"
teksti4 DB " Anna_2_luvun_nimittaja: $"
teksti5 DB " Tulos$"
teksti6 DB " Kokonaisluvut: $"
teksti7 DB " Jakojaannos: $"
rivinvaihto DB 13,10,0
.CODE 		;koodi
.STARTUP

alku:
mov ah,9
mov dx,OFFSET teksti1
int 21h


mov ah,1	;1 luvun osoittaja ch:ään
int 21h
mov ch,al


mov ah,9
mov dx,OFFSET teksti2
int 21h

mov ah,1	;1 luvun nimittäjä bl:ään
int 21h
mov bl,al



mov ah,9
mov dx,OFFSET teksti3
int 21h

mov ah,1	;2 luvun osoittaja bh:ään
int 21h
mov bh,al


mov ah,9
mov dx,OFFSET teksti4
int 21h

mov ah,1	;2 luvun nimittäjä cl:ään
int 21h
mov cl,al

cmp bl,cl 	; verrataan nimittäjiä keskenään

je muunnos	; jos yhteinen nimittäjä niin muunnokseen
mov ax,0	; nollataan rekisteri
mov al,bl     	; siirretään 1 luvun nimittäjä al rekisteriin kertolaskua varten
mul cl		; 1 luvun nimittäjä kerrotaan 2 luvun nimittäjällä. Tulos menee ax:ään
push ax	; yhteinen nimittäjä talteen
push ax
div bl		; jaetaan yhteinen nimittäjä 1 luvun nimittäjällä, jotta saadaan osoittajiin kerroin, kerroin al:ään
mul ch		; 1 luvun osoitteen kerominen.
mov ch,al	; 1 luvun uusi osoittaja
pop ax
div cl		; jaetaan yhteinen nimittäjä 2 luvun nimittäjällä,              jotta saadaan osoittajiin kerroin, kerroin al:ään
mul bh		; 2 luvun osoitteen kerominen.
mov bh,al	; 2 luvun uusi osoittaja

add ch,bh	;uusien osoittajien yhteenlasku.


;verrataan onko viivan päällä enemmän kuin alla
pop ax
cmp ch,al
jle tulos
jmp muunnos

muunnos:

mov bl,al	;Yhteinen nimittäjä bl:ään
mov al,ch	;Yhteenlaskettu osoittaja al:ään
div bl		;Jaetaan osoittaja nimittäjällä
mov ch,ah	;Jakojäännös (modulo) talleen ch.
mov cl,al	;Kokonais luvut
push cx
push cx

tulos:
mov ah,9
mov dx,OFFSET teksti5
int 21h

mov ah,9
mov dx,OFFSET teksti6
int 21h

pop cx
mov dl,cl
mov ah,2
int 21h

mov ah,9
mov dx,OFFSET teksti7
int 21h

pop cx
mov dl,ch
mov ah,2
int 21h

jmp alku

.EXIT
END

Mod. lisäsi kooditagit!

jalski [27.02.2012 15:27:07]

#

ruukie kirjoitti:

Tuon verran sain kasattua, mutta joku siinä klikkaa..

En tässä nyt kahvitaolla ehtinyt tuota sen paremmin katsomaan, mutta silmiini ei nopealla vilkaisulla ainakaan osunut kohtaa missä muutat tuon ascii-syötteen numeeriseen muotoon laskemista varten.

ruukie [27.02.2012 17:51:11]

#

Se jalski siinä taitaa just olla onkelmana miten sen teen?

jalski [27.02.2012 21:13:58]

#

Assembleri hommat ei itsellä ihan tuoreessa muistissa ole vähäisen käytön vuoksi, mutta kokeillaan...

Kaksi ascii-merkki tavua saat luku tavuksi jotenkin näin:

mov ax, [digits]
sub ax, '00'
aad
mov [luku], al

Päinvastoin homma taitaapi onnistua näin:

mov al, [luku]
aam
xchg al, ah
add ax, '00'
mov [digits], ax

Jos tarvitset enemmän desimaaleja niin hiukan soveltamalla onnistunee kohtuullisen helposti.

jalski [28.02.2012 07:55:57]

#

Pistetään nyt huvin vuoksi vielä esille myös muunnos ascii muotoiseksi heksadesimaaliksi.

muunna:
                mov al, [luku]
                aam 16
@digit2:
                add al, 090h
                daa
                adc al, 040h
                daa
@digit1:
                xchg al, ah
                add al, 090h
                daa
                adc al, 040h
                daa
@talteen:
                mov [heksaluku], ax

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta