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!
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.
Se jalski siinä taitaa just olla onkelmana miten sen teen?
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.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.