Proszę o pomoc w poprawieniu programu

tom9012

Użytkownik
Dołączył
Maj 23, 2011
Posty
5
Proszę o poprawienie programu:


Kod:
;y=((x+2z)*1/2) + ((2x+2z)*1/2)+((3x+2z)*1/2)+((4x+2z)*1/2)
;made by Assarelliuss aka MrZabojad
;tutaj jest sam algorytm liczenia
;pisząc powołałem się na prawa logiki
;jeżeli coś nie działa to już nie moja wina
;problem rozwiązałem drzewkiem:
; ((x+2z)*1/2) + ((2x+2z)*1/2)+((3x+2z)*1/2)+((4x+2z)*1/2)
; ... \............... /........... /............. /       
;......\............../............/............../        
;........\.........../............/............../          
;.........\........./............/............../            
;.........\....+../............/............ /             
;............\..../............/............ /                
;.......... [wynik]......../............./                   
; ............\............ /............/                           
;............\....+......./............/                      
;............\............/............/                  
; ............ [wynik]............../                                      
;........................\............/                       
;......................\.............../                 
;.......................\.............. /                             
;........................\.....+...../                                
;.........................\........./                              
;..........................\......./                               
;.......................... [wynik]                                         
;                                                                  



;tutaj Prośba o podanie dwóch liczb x i z
xor eax, eax
mov eax, [z]
mul 2 ;eax = 2z
add eax, [x] ; eax=2z + x
mul 1 ; mnożymy razy 1 ;w sumie nie potrzebne napisałem tylko by zgadzało się z równaniem
div 2 ;dzielimy eax przez 2
;w eax jest wynik ((x+2z)*1/2)
;wrzucam na stos eax
push eax
;((
mov eax, [x]
mul 2
push eax
mov eax, [z]
;)
mul 2
pop ebx
add eax, ebx
mul 1 ;też jedynie dla zgodności z równaniem
div 2
push eax ; w eax jest wynik ((2x+2z)*1/2)
;)
pop eax
pop ebx
add eax, ebx
push eax ; na stos wrzucamy wynik ((x+2z)*1/2) + ((2x+2z)*1/2)


;((3x+2z)*1/2)
mov eax, [x]
mul 3
push eax

mov eax, [z]
mul 2
pop ebx

add eax, ebx
mul 1
div 2
pop ebx
add eax, ebx ;dodajemy (((x+2z)*1/2) + ((2x+2z)*1/2)) do ((3x+2z)*1/2)
push eax ;wrzucamy na stos powyższy wynik
;((4x+2z)*1/2)
mov eax, [x]
mul 4
push eax
mov eax, [z]
mul 2
pop ebx
add eax, ebx
mul 1
div 2

; teraz końcowa część: sumujemy wszystko
pop ebx
add eax, ebx
mov [y] , eax
;tutaj napisz sobie wyświetlenie y

dd x 0
dd z 0
dd y 0
 
Ostatnio edytowane przez moderatora:

shoorick

Użytkownik
Dołączył
Lipiec 17, 2008
Posty
66
nie złe byłobyś gdybyś z początku zkompiluwał i zobaczył błędy.
Proszę o poprawienie programu:


;y=((x+2z)*1/2) + ((2x+2z)*1/2)+((3x+2z)*1/2)+((4x+2z)*1/2)
;made by Assarelliuss aka MrZabojad
;tutaj jest sam algorytm liczenia
;pisząc powołałem się na prawa logiki
;jeżeli coś nie działa to już nie moja wina
;problem rozwiązałem drzewkiem:
; ((x+2z)*1/2) + ((2x+2z)*1/2)+((3x+2z)*1/2)+((4x+2z)*1/2)
; ... \............... /........... /............. /
;......\............../............/............../
;........\.........../............/............../
;.........\........./............/............../
;.........\....+../............/............ /
;............\..../............/............ /
;.......... [wynik]......../............./
; ............\............ /............/
;............\....+......./............/
;............\............/............/
; ............ [wynik]............../
;........................\............/
;......................\.............../
;.......................\.............. /
;........................\.....+...../
;.........................\........./
;..........................\......./
;.......................... [wynik]
;



;tutaj Prośba o podanie dwóch liczb x i z
xor eax, eax ; <<== nie ma sensu w tym przed lądowaniam
mov eax, [z]
mul 2 ;eax = 2z ; <<== albo używaj "imul", albo musisz mnożyć na liczbę w innym registrze
add eax, [x] ; eax=2z + x
mul 1 ; mnożymy razy 1 ;w sumie nie potrzebne napisałem tylko by zgadzało się z równaniem ; <<== dodaj ";" przed komandę - wystarzy żeby zgadzić, inaczej to jest nie zdrowe
div 2 ;dzielimy eax przez 2 ; <<== albo "idiv", albo register zamjast liczby
;w eax jest wynik ((x+2z)*1/2)
;wrzucam na stos eax
push eax
;((
mov eax, [x]
mul 2
push eax
mov eax, [z]
;)
mul 2
pop ebx
add eax, ebx
mul 1 ;też jedynie dla zgodności z równaniem
div 2
push eax ; w eax jest wynik ((2x+2z)*1/2)
;)
pop eax
pop ebx
add eax, ebx
push eax ; na stos wrzucamy wynik ((x+2z)*1/2) + ((2x+2z)*1/2)


;((3x+2z)*1/2)
mov eax, [x]
mul 3
push eax

mov eax, [z]
mul 2
pop ebx

add eax, ebx
mul 1
div 2
pop ebx
add eax, ebx ;dodajemy (((x+2z)*1/2) + ((2x+2z)*1/2)) do ((3x+2z)*1/2)
push eax ;wrzucamy na stos powyższy wynik
;((4x+2z)*1/2)
mov eax, [x]
mul 4
push eax
mov eax, [z]
mul 2
pop ebx
add eax, ebx
mul 1
div 2

; teraz końcowa część: sumujemy wszystko
pop ebx
add eax, ebx
mov [y] , eax
;tutaj napisz sobie wyświetlenie y

dd x 0
dd z 0
dd y 0
żeby startować z asemblerzem musisz startować z jakimś "witaj światu", żeby potem dodać swoj kod do nego. podobny program albo musisz próbować z debugerem, albo musisz dodać procedury wyświetlenia wyników (to nie jest tak prosto jak może się zdaje). jeżeli używasz turbo paskala z procedurom w asemblerze - nie masz problemu z wyświetleniem wyników, ale musisz wieć jak przeslać argumenty (x,z), lepsze używaj 16-bitowy registry (ax, nie eax), wynik funkcji wraca przez registr ax.
 

tom9012

Użytkownik
Dołączył
Maj 23, 2011
Posty
5
tylko że ja nie mam zielonego pojęcia jak to zrobic żeby działało.... proszę o pomoc
 
Do góry Bottom