ASSEMBLER odejmowanie w kodzie U2 oraz zamiana na OCT, HEX


(Bipocich) #1

Witam Serdecznie,

jestem w trakcie pisania kodu, niestety nie do końca mi to wychodzi :frowning:

W związku z powyższym proszę o pomoc.

Oto kod programu:

format MZ

entry main: start

stack 100h


segment main

start:

call czysc




mov ax, dane

mov ds, ax

główna:


call dana1

call minus

call dana2

call rownasie

call wynik


call pytanie

call linia1

call opcje

call linia2

call wybor


ety1:

call pobierz


cmp al, 1Bh

je koniec

;jne ety1



cmp al, 'L'

je wprowadz_dana1


cmp al, 'P'

je wprowadz_dana2


;cmp al, 'L'

;je wykonaj_operacje

jne ety1





;mov ah, 4ch

;int 21h


;-------------------

wprowadz_dana1:

mov dx, text1

call wyswietl



mov bx, liczba1


mov cx, 8

petla:

mov ah,07h

int 21h


cmp al,'0'

je dobrze


cmp al,'1'

je dobrze

jne petla


dobrze:

mov [bx], al

mov dx, bx

call wyswietl


inc bx




loop petla


;call czysc


;call główna



call dana1

ret


wprowadz_dana2:

mov dx, text2

call wyswietl



mov bx, liczba2


mov cx, 8

petla1:

mov ah,07h

int 21h


cmp al,'0'

je dobrze1


cmp al,'1'

je dobrze1

jne petla1


dobrze1:

mov [bx], al

call wysw_bin


inc bx




loop petla


call dana2

ret




wysw_bin:

        mov cl,8                

etyk1:

        push cx                 

        rcl [liczba2],1

        jc etyk2

        mov dl,'0' 

        jmp etyk3

etyk2:

        mov dl,'1' 

etyk3:

        mov ah,2                

        int 21h                 

        pop cx                  

        loop etyk1

        rcl [liczba2],1

        ret




wyswietl:

mov ah, 09h

int 21h

ret


pobierz:

mov ah, 07h

int 21h

ret


koniec:

mov ah, 4ch

int 21h


minus:

mov bh,0

mov dl, 00

mov dh, 1

mov ah, 2

int 10h

mov dx, text4

call wyswietl

ret


rownasie:

mov bh,0

mov dl, 00

mov dh, 3

mov ah, 2

int 10h

mov dx, text5

call wyswietl

ret



dana1:

mov bh,0

mov dl, 00

mov dh, 00

mov ah, 2

int 10h

mov dx, text1

call wyswietl

mov dx, liczba1

call wyswietl


ret



dana2:

mov bh,0

mov dl, 0

mov dh, 2

mov ah, 2

int 10h

mov dx, text2

call wyswietl

mov dx, liczba2

call wyswietl

ret


wynik:

mov bh,0

mov dl, 0

mov dh, 4

mov ah, 2

int 10h

mov dx, text3

call wyswietl

ret


pytanie:

mov bh,0

mov dl, 0

mov dh, 6

mov ah, 2

int 10h

mov dx, text6

call wyswietl

ret


opcje:

mov bh,0

mov dl, 0

mov dh, 8

mov ah, 2

int 10h

mov dx, text7

call wyswietl

ret




czysc:

mov ah, 0

mov al, 3

int 10h

ret



linia1:

mov bh,0

mov dl, 0

mov dh, 7

mov ah, 2

int 10h

mov dx, text9

call wyswietl

ret



linia2:

mov bh,0

mov dl, 0

mov dh, 9

mov ah, 2

int 10h

mov dx, text9

call wyswietl

ret



wybor:

mov bh,0

mov dl, 0

mov dh, 10

mov ah, 2

int 10h

mov dx, text10

call wyswietl

ret


segment dane

liczba1 db ' $'

liczba2 db ' $'

tekst db 'TESTOWY$'

text1 db 'Dana1 = $'

text2 db 'Dana2 = $'

text3 db 'Wynik = $'

text4 db ' - $'

text5 db ' = $'

text6 db 'Co chcesz zrobic?$'

text7 db ' - wybor dane1; 
 - wybor dane2; - wykonanie operacji; - wyjscie$'

text9 db '---------------------------------------------------------------$'

text10 db 'Wybor: $'

Mianowicie:

  • chciałbym aby podczas wprowadzania pierwszej i drugiej liczby, wyświetlały się one w jednym ciągu (w czasie ich edycji), a nie jak ma to miejsce teraz - z odstępami

  • ponad to fajnie by było dodać możliwość cofania omyłkowo prowadzonej 1 lub 0 w czasie edycji zmiennej

  • oczywiście tak jak w temacie, genialnie by było gdyby druga wartość została odjęta od pierwszej (dane wprowadzamy w kodzie U2)

  • no i na końcu konwersja do poszczególnych systemów binarnych.

Z góry dziękuję za wskazówki/linki/korekty/itp./itd..

Jeśli uda mi się coś jeszcze wykombinować, to zaktualizuję kod :slight_smile:


(Bipocich) #2

Powyższy problem rozwiązałem w następujący sposób - oto kod:

format MZ
entry main: start
stack 100h

;-------------------------------------------------
;MAKRA
;-------------------------------------------------
macro wyswietl text
{
   mov dx , text
   mov ah, 09h
   int 21h
}

macro wstaw text
{
   mov [text],al

}

macro zerowanie text
{
local petla
  mov al, [spacja]
mov cx,8
mov si,0
petla:
     mov [text+si],al
     inc si
     loop petla

}



macro kreskowanie text
{
  mov al, [spacja]
mov cx,8
mov si,0
petla2:
     mov [text+si],al
     inc si
     loop petla2

}

macro kopiowanie text
{

mov cx,8
mov si,0
petla:
     mov al, [text+si]
     mov [pomocnicza+si],al
     inc si
     loop petla

}

macro na_HEX tmp
{
        local ety4, ety5, ety6, ety7
        mov al,[tmp] ;pierwsza cyfra hex
        shr al,4
        cmp al,10
        jb ety4
        add al,55 ; kody ascii liter
        jmp ety5
ety4:
        add al,30h
ety5:                
        mov dl,al
        mov ah,2                           
        int 21h                            
                                           
        mov al,[tmp] ;druga cyfra hex
        and al,0Fh
        cmp al,10 
        jb ety6   
        add al,55 ; kody ascii liter
        jmp ety7
ety6:
        add al,30h
ety7:                
        mov dl,al
        mov ah,2                           
        int 21h
}






macro na_OCT tmp
{
        mov al,[tmp] ;pierwsza cyfra oct
        shr al,6                           
        add al,30h                         
        mov dl,al                          
        mov ah,2                           
        int 21h                            
                                           
        mov al,[tmp] ;druga cyfra oct
        shl al,2                        
        shr al,5                        
        add al,30h                      
        mov dl,al                       
        mov ah,2                        
        int 21h                         
         
        mov al,[tmp] ; trzecia dyfra oct
        and al,7
        add al,30h
        mov dl,al
        mov ah,2
        int 21h
}


macro konwersja tmp
{
local petla
mov cx,8
mov si,7
petla:
mov al, [tmp+si]
rcr al, 1
rcl [xyz],1
loop petla

}

;-------------------------------------------------
;MAKRA
;-------------------------------------------------



segment main
start:




mov ax, dane
mov ds, ax
główna:
call czysc

call dana1
call minus
call dana2
call rownasie
call wynik

call pytanie
call linia1
call opcje
call linia2
call wybor

ety1:
call pobierz

cmp al, 1Bh
je koniec
;jne ety1


cmp al, 'L'
je wprowadz_dana1

cmp al, 'P'
je wprowadz_dana2

cmp al, 'W'
je odejmowanie

;cmp al, 'L'
;je wykonaj_operacje
jne ety1




;mov ah, 4ch
;int 21h

;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
wprowadz_dana1:

zerowanie liczba1
zerowanie liczba3


wyswietl text1


mov cx,8
mov si,0
spr1:

call pobierz

cmp al,'0'
je dobrze

cmp al,'1'
je dobrze


cmp al, 8
je znak_wstecz

cmp al, 13
je znak_enter
jne spr1



dobrze:

mov [liczba1+si],al
wstaw tmp
wyswietl tmp
inc si
loop spr1


jmp spr2



znak_wstecz:
cmp cx,8
je spr1

dec si

wstaw tmp
wyswietl tmp

jmp spr1



znak_enter:

mov cx,si
przesuniecie:


call główna

spr2:
call pobierz
cmp al, 8
je znak_wstecz

cmp al, 13
je znak_enter
jne spr2
ret


;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
wprowadz_dana2:

zerowanie liczba2
zerowanie liczba3


wyswietl text2


mov cx,8
mov si,0
spr3:

call pobierz

cmp al,'0'
je dobrze1

cmp al,'1'
je dobrze1


cmp al, 8
je znak_wstecz1

cmp al, 13
je znak_enter1
jne spr1



dobrze1:

mov [liczba2+si],al
wstaw tmp
wyswietl tmp
inc si
loop spr3


jmp spr4



znak_wstecz1:
cmp cx,8
je spr3

dec si

wstaw tmp
wyswietl tmp

jmp spr3



znak_enter1:

mov cx,si
przesuniecie1:


call główna

spr4:
call pobierz
cmp al, 8
je znak_wstecz1

cmp al, 13
je znak_enter1
jne spr4
ret

;-------------------------------






pobierz:
mov ah, 07h
int 21h
ret

koniec:
mov ah, 4ch
int 21h

minus:
mov bh,0
mov dl, 00
mov dh, 1
mov ah, 2
int 10h
wyswietl text4
ret

rownasie:
mov bh,0
mov dl, 00
mov dh, 3
mov ah, 2
int 10h
wyswietl text5
ret


dana1:
mov bh,0
mov dl, 00
mov dh, 00
mov ah, 2
int 10h
wyswietl text1

wyswietl liczba1

wyswietl przerwa

konwersja liczba1
na_HEX xyz
wyswietl przerwa
wyswietl nawias1
na_OCT liczba1
wyswietl nawias2
ret

dana2:
mov bh,0
mov dl, 0
mov dh, 2
mov ah, 2
int 10h
wyswietl text2

wyswietl liczba2

wyswietl przerwa
konwersja liczba2
na_HEX xyz
wyswietl przerwa
wyswietl nawias1
na_OCT liczba2
wyswietl nawias2
ret


wynik:
mov bh,0
mov dl, 0
mov dh, 4
mov ah, 2
int 10h
wyswietl text3

wyswietl liczba3
wyswietl przerwa
na_HEX liczba3
wyswietl przerwa
wyswietl nawias1
na_OCT liczba3
wyswietl nawias2
ret

pytanie:
mov bh,0
mov dl, 0
mov dh, 6
mov ah, 2
int 10h
wyswietl text6
ret

opcje:
mov bh,0
mov dl, 0
mov dh, 8
mov ah, 2
int 10h
wyswietl text7
ret



czysc:
mov ah, 0
mov al, 3
int 10h
ret


linia1:
mov bh,0
mov dl, 0
mov dh, 7
mov ah, 2
int 10h
wyswietl text9
ret


linia2:
mov bh,0
mov dl, 0
mov dh, 9
mov ah, 2
int 10h
wyswietl text9
ret


wybor:
mov bh,0
mov dl, 0
mov dh, 10
mov ah, 2
int 10h
wyswietl text10
ret

odejmowanie:
     mov cx,8
     mov si,7
     clc

 petla_odejmowanie:
        mov al,[liczba1+si] ; tab[i]
        sbb al,[liczba2+si] ; dodaj z przeniesieniem

        cmp al, 0FFh
        jne ety1x
        mov al,1
ety1x:
        add al,30h
        mov [liczba3+si],al
        dec si
        loop petla_odejmowanie

;mov al, cf
;cmp al,1


   jmp główna

segment dane
liczba1 db ' $'
liczba2 db ' $'
liczba3 db ' $'
pomocnicza db ' $'
tekst db 'TESTOWY$'
text1 db 'Dana1 = $'
text2 db 'Dana2 = $'
text3 db 'Wynik = $'
text4 db ' - $'
text5 db ' = $'
text6 db 'Co chcesz zrobic?$'
text7 db ' <L> - wybor dane1; <P> - wybor dane2; <W> - wykonanie operacji; <Esc> - wyjscie$'
text9 db '---------------------------------------------------------------$'
text10 db 'Wybor: $'
tmp db ' $'
tmp1 db 0
przerwa db ' $'
spacja db ' $'
nawias1 db '[$'
nawias2 db ']$'
kreska db '_$'

xyz db 45h

:smiley: