[MASM/FASM] Zadanie - zbudowanie trójkąta

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
Witam nie wiem jak ugryźć to zadanko:

Dane są trzy dowolne odcinki a,b,c. Program ma sprawdzać czy można z nich zbudować trójkąt.

Proszę o pomoc :)
 

snn

Użytkownik
Dołączył
Czerwiec 2, 2012
Posty
1
W teorii:
aby zbudować trójkąt suma dwoch bokow musi byc wieksza od trzeciego czyli

a+b>c
b+c>a
a+c>b

chyba się nie pomyliłem :)
 

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
ma jeszcze jedno pytanie

gdy wczytam sobie jakąś liczbę do rejestru np. al i bl to gdy dodam to funkcją add al, bl to jak potem odzyskać z powrotem te liczby żeby móc je dalej porównywać.
oraz czy po wczytaniu funkcją mov al, X to czy ta liczba jest w al i X czy już tylko w al?
oraz czy istnieje funkcja kopiowania, :) mam na myśli żeby skopiować al do cl?
 

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
siedziałem dość długo i napisałem coś takiego ale nie działa tak jak powinno :) gdybyście mogli rzucić na to okiem... ;p

data segment
wiadomosc DB "Podaj dlugosc boku a: $"
wiadomosc1 DB 13,10,"Podaj dlugosc boku b: $"
wiadomosc2 DB 13,10,"Podaj dlugosc boku c: $"
komunikat DB 13,10,"Trojkat mozliwy do zbudowania $"
komunikat1 DB 13,10,"Nie istnieje taki trojkat $"

X DB 0
Y DB 0
Z DB 0

ends

stack segment
dw 128 dup(0)
ends

code segment
start:

mov dx, @DATA
mov ds, dx

mov dx, offset wiadomosc
mov ah, 9
int 21h

mov ah,01h ;wczytywanie 1 znaku z klawiatury
int 21h
sub al, 30h
mov X,al

mov dx, offset wiadomosc1
mov ah, 9
int 21h

mov ah,01h ;wczytywanie 2 znaku z klawiatury
int 21h
sub al, 30h
mov Y,al

mov dx, offset wiadomosc2
mov ah, 9
int 21h

mov ah,01h ;wczytywanie 3 znaku z klawiatury
int 21h
sub al, 30h
mov Z,al



mov al,X ;wpisanie zmiennych do rejestru
mov bl,Y



add al, bl ;dodaj X+Y
cmp al, cl
jb info:
ja dalej:

dalej:
mov cl, Z
add bl, cl
cmp bl, al

ja dalej1:
jb info:

dalej1:
add al, cl
cmp al,bl
jb info:
ja koniec:

koniec:
mov dx,offset komunikat
mov ah,9
int 21h

info:
mov dx,offset komunikat1

mov ah,9
int 21h

mov ax, 4c00h
int 21h

ends

end start
 
Ostatnia edycja:

shoorick

Użytkownik
Dołączył
Lipiec 17, 2008
Posty
66
mov al,X ;wpisanie zmiennych do rejestru
mov bl,Y

add al, bl ;dodaj X+Y
cmp al, cl
a co masz w cl? musisz napisać jeszcze "mov cl,Z"

również przed nowym porównianiam musisz znów załadować wszysci rejestry

++++

używaj debugera, lepiej td, ale można i debug z systemu - będziesz znał co robi program w rejestrach każdego razu
 
Ostatnia edycja:

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
jak mam odświeżyć na nowo rejestry żeby były na nowo z tymi samymi niezmienionymi wartościami??
 

shoorick

Użytkownik
Dołączył
Lipiec 17, 2008
Posty
66
znów zrob "mov al,X" i tak dalej

jak zrobisz add al,bl - w al masz już nie X, lecz X+Y, dlatego przed następnym krokem musisz znów zrobić "mov al,X", ale rejestry, które się nie zmieniały w poprzednim krokie, można ich nie odświeżać
 

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
poprawiłem te błędy niestety nadal nie działa poprawnie :( nie ważne jakie liczby wpisze wylatuje " Nie istnieje taki trójkąt"


dalej: mov al,X
mov bl,Y
mov cl,Z

add bl, cl
cmp bl, al

ja dalej1
mov al,X
cmp bl, al
jb nie------------------------------------------------>> TUTAJ przechodzi odrazu do etykiety "nie"

dalej1:
mov al,X
mov bl,Y
mov cl,Z
 
Ostatnia edycja:

shoorick

Użytkownik
Dołączył
Lipiec 17, 2008
Posty
66
jaki liczby X, Y i Z są? może poprawnie przechodzi?

dalej: mov al,X
mov bl,Y
mov cl,Z

add bl, cl
cmp bl, al

ja dalej1
mov al,X
cmp bl, al
jb nie------------------------------------------------>> TUTAJ przechodzi odrazu do etykiety "nie"

dalej1:
mov al,X
mov bl,Y
mov cl,Z

kalkulacja:
mov al,X
mov bl,Y
mov cl,Z
add al,bl
cmp al,cl
jbe nie ; jesli X+Y<=Z
mov al,X ; inne rejestry są nie zmieniany
add al,cl
cmp al,bl
jbe nie ; jesli X+Z<=Y
mov al,X
add bl,cl
cmp bl,al
jbe nie
ok:
drukuj "Ok"
jmp exit
nie:
drukuj "Nie"
exit:
mov ax,4c00h
int 21h

0.png
 

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
jaki liczby X, Y i Z są? może poprawnie przechodzi?



kalkulacja:
mov al,X
mov bl,Y
mov cl,Z
add al,bl
cmp al,cl
jbe nie ; jesli X+Y<=Z <---------------------------------tu jest error odrazu przechodzi do etykiety nie :(
mov al,X ; inne rejestry są nie zmieniany
add al,cl
cmp al,bl
jbe nie ; jesli X+Z<=Y
mov al,X
add bl,cl
cmp bl,al
jbe nie
ok:
drukuj "Ok"
jmp exit
nie:
drukuj "Nie"
exit:
mov ax,4c00h
int 21h

View attachment 220
po pierwszym porównaniu cmp al,bl (wpisane liczby X=2 Y=3 Z=4) jbe nie przechodzi do etykiety nie
 

elkozirro

Użytkownik
Dołączył
Maj 30, 2012
Posty
20
Poprawiłem kod, ale nadal źle działa. Cokolwiek wpisze to "TROJKAT ISTNIEJE $"


data segment
oks DB "TROJKAT ISTNIEJE $"
niet DB "NIE ISTNIEJE $"

wiadomosc DB "Podaj dlugosc boku a: $"
wiadomosc1 DB 13,10,"Podaj dlugosc boku b: $"
wiadomosc2 DB 13,10,"Podaj dlugosc boku c: $"

X DB 0
Y DB 0
Z DB 0
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
mov dx, @DATA
mov ds, dx

mov dx, offset wiadomosc
mov ah, 9
int 21h

mov ah,01h ;wczytywanie 1 znaku z klawiatury
int 21h
mov X,al

mov dx, offset wiadomosc1
mov ah, 9
int 21h

mov ah,01h ;wczytywanie 2 znaku z klawiatury
int 21h
mov Y,bl

mov dx, offset wiadomosc2
mov ah, 9
int 21h

mov ah,01h ;wczytywanie 3 znaku z klawiatury
int 21h
mov Z,cl



mov al,X
mov bl,Y
mov cl,Z
add al,bl
cmp al,cl
jle nie ; jesli X+Y<=Z
mov al,X ; inne rejestry są nie zmieniany
add al,cl
cmp al,bl
jle nie ; jesli X+Z<=Y
mov al,X
mov cl,Z
add bl,cl
cmp bl,al
ja ok
jle nie

ok:
mov dx,offset oks
mov ah,9
int 21h
jmp exit
nie:
mov dx,offset niet
mov ah,9
int 21h
exit:
mov ax,4c00h
int 21h

ends

end start
 

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
Przerwanie, które używasz do wczytania liczby - wczytuje znak. Spróbuj wczytany znak przekonwertować na liczbę i wtedy porównywać.
 

shoorick

Użytkownik
Dołączył
Lipiec 17, 2008
Posty
66
View attachment 222
Kod:
    use16    
    org 100h    
    jmp start
    
wiadomosc DB "Podaj dlugosc boku a: $"
wiadomosc1 DB 13,10,"Podaj dlugosc boku b: $"
wiadomosc2 DB 13,10,"Podaj dlugosc boku c: $"
komunikat DB 13,10,"Trojkat mozliwy do zbudowania $" 
komunikat1 DB 13,10,"Nie istnieje taki trojkat $"


X DB 0
Y DB 0
Z DB 0


start:
    mov dx, wiadomosc
    mov ah, 9
    int 21h
    
    mov ah,01h ;wczytywanie 1 znaku z klawiatury
    int 21h
    sub al, 30h
    mov [X],al
    
    mov dx, wiadomosc1
    mov ah, 9
    int 21h
    
    mov ah,01h ;wczytywanie 2 znaku z klawiatury
    int 21h
    sub al, 30h
    mov [Y],al 
    
    mov dx, wiadomosc2
    mov ah, 9
    int 21h
    
    mov ah,01h ;wczytywanie 3 znaku z klawiatury
    int 21h
    sub al, 30h
    mov [Z],al 
    
    
    
kalkulacja:
    mov al,[X]
    mov bl,[Y]
    mov cl,[Z]
    add al,bl
    cmp al,cl 
    jbe nie 
    mov al,[X] 
    add al,cl
    cmp al,bl
    jbe nie 
    mov al,[X]
    add bl,cl
    cmp bl,al
    jbe nie
ok:
    mov dx,komunikat
    mov ah,9
    int 21h
    jmp exit
nie:
    mov dx,komunikat1
    mov ah,9
    int 21h
exit:
    ret

kompiluj ten kod fasmem

+++++++++++++++++++++++++++++

reczywiście, program jest sproszczony: liczbe muszą być tylko 0-9 a nie mogą być negatywne
 
Ostatnia edycja:
Do góry Bottom