[ASM] Weryfikacja poprawności kodu

0

Witam serdecznie.

Na wstępie zaznaczę, że jeżeli chodzi o Assembler to jestem początkujący. Piszę program w ASM 16-bitowym (DOSBox, nasm).

Prosiłbym o sprawdzenie, czy poniższy kod rzeczywiście obliczy wzór 3(a+2(b+c)):

org 100h

; z=3(a+2(b+c))

push word a
push word c
push word b

pop ax ; ax = b
pop bx ; bx = c

add ax, bx ; ax = (b+c)

mov al, 2
mul ax ; ax = 2 * ax = 2(b+c)

pop bx ; bx = a
add ax, bx ; ax = a + ax = a + 2(b+c)

mov al, 3
mul ax ; ax = 3(a+2(b+c))

mov [z], ax ; z=3(a+2(b+c))

a DB 5
b DB 3
c DB 7
z DB 0

Będę bardzo wdzięczny za informacje zwrotne oraz wszelkie wskazówki odnośnie do tego, jakby ten kod mógłby być "lepszy".

1

Skompiluj, uruchom kod i sprawdź czy faktycznie wyniki są poprawne :)

0

No tak, byłoby to nawet oczywiste. Ale nie wiem, czy potrafię zrobić output poprawnie w tym przykładzie. :D

0

Razy 2 możesz zamienić na add ax, ax

0

HELP ME :-)

title

0

wrzucasz na stos jakieś a? jakieś b?

Musisz pobrać z klawiatury liczbę a i potem liczbę b i dodać, bez stosu.
Stos możesz użyć jak wyodrębnisz kod do innej funkcji.

Na początek usuń te```
push i pop

mov ax, 0x10
mov bx, 0x10

0

Zmienne, które są w ostatnich linijkach mają podane wartości. Podejrzewam, że sam proces poprawnie "podstawił je do wzoru" i zapisał wartość w zmiennej z, natomiast wartość zmiennej z się nie wyświetla. Czy mógłby mi ktoś wyjaśnić, dlaczego otrzymuję tego rodzaju output zamiast konkretnej wartości liczbowej?

Dodam, że pozbyłem się stosu i zastąpiłem tę metodę instrukcjami mov, które zapisały wartości w rejestrach bezpośrednio:

org 100h

; z=3(a+2(b+c))

mov ax, word [b] ; ax = b
mov bx, word [c] ; bx = c

add ax, bx ; ax = (b+c)

add ax, ax ; 2(b+c)

mov bx, word [a]; bx = a
add ax, bx ; ax = a + ax = a + 2(b+c)

mov al, 3
mul ax ; ax = 3(a+2(b+c))

mov [z], ax ; z=3(a+2(b+c))
; output
mov ah, 9
mov dx, z
int 21h
; zakonczenie programu
mov ax, 4C00h
int 21h

a DB 5
b DB 3
c DB 7
z DB 0

Efekt ten sam.

0

.

0

Zrobiłem tak jak pisałeś, ale mov [z], ax => mov z, ax wywala błąd.

Debuguję program i do mnożenia wyniki wydają się być w porządku... Porównuję obliczenia własne z debuggerem, i według stanu rejestrów 3*25 = 9 zamiast 75 ...

org 100h

; z=3(a+2(b+c))

mov ax, word [b] ; ax = b ; debug - ok
mov bx, word [c] ; bx = c ; debug - ok

add ax, bx ; ax = (b+c) ; debug - ok

add ax, ax ; 2(b+c) ; debug - ok

mov bx, [a] ; bx = a ; debug - ok

add ax, bx ; ax = a + ax = a + 2(b+c) ; debug - ok

mov al, 3
mul ax ; ax = 3(a+2(b+c))

mov word [z], ax ; z=3(a+2(b+c))

; end
mov ax, 4C00h
int 21h

a DW 5
b DW 3
c DW 7
z DW 0

1 użytkowników online, w tym zalogowanych: 0, gości: 1