Zadanie bardzo podobne do tego poniżej, z tym, że bez mnożenia i koniecznością zapisu kolejnych n komórek (brak trzeciego rejestru indeksowego – ix i iy są już wykorzystane – trzeba wymyślić sposób adresowania trzeciego wektora innym rejestrem np. hl).
.z80
bdos equ 5
aseg
start: org 100H
; iloczyn skalarny wektorow
; struktura wektory:
; 1 bajt - dlugosc n
; n bajtow - pierwszy wektor w1
; n bajtow - drugi wektor w2
; kazda wspolrzedna w1 jest
; mnozona przez odpowiednia wspolrzedna
; w2 i obliczana jest suma.
; wykorzystanie rejestrow :
; b - licznik wspolrzednych
; ix - adres wspolrzednej w1
; iy - adres wspolrzednej w2
ld hl,wektory;adres struktury do hl
xor a ;a=0
ld c,(hl) ;n do c
inc hl ;adres poczatku w1 do hl
push hl ;a potem przez stos
pop ix ;do ix
ld b,a ;b=0
add hl,bc ;adres poczatku w2 do hl
push hl ;a potem przez stos
pop iy ;do iy
ld b,c ;n do b
dodaj:
ld c,(ix) ;wspolrzedna w1 do c
push de ;
push bc ;
ld d,(iy) ;wspolrzedna w2 do d
push hl
push af
ld b,0 ;b=0
ld e,9 ;e jest teraz licznikiem
;bitow przy mnozeniu
mnoz: ;mnozenie b=c*d
ld a,c
rra ;bit w1 do cy
ld c,a ;przesuniecie c w prawo
dec e
jr z,bajt ;czy juz wszystkie bity?
ld a,b
jr nc,zero ;jesli bit w1=0 skocz
add a,d ;jesli bit w1=1 dodaj w2
zero:
rra
ld b,a
jr mnoz
bajt:
ld b,a
pop af
add a,b ;kolejny iloczyn dodaj ;do a
pop hl
pop bc
pop de
inc ix ;nastepna wsp w1
inc iy ;nastepna wsp w2
djnz dodaj
ld hl,wynik;wartosc iloczynu
ld (hl),a ;do komorki wynik
push hl
call hex0
pop hl
call hex0
jp bdos
; hl wskazuje komorke z ktorej bedzie
; wypisywana pierwsza cyfra hex
hex0: xor a ;a=0
rld ;4 bardziej znaczace ;bity do a
add a,90H ;magiczne operacje,
daa ;ktore wartosc cyfry hex
adc a,40H ;zamieniaja na ASCII
daa ;0-9 30-39 A-F 41-45
ld e,a ;znak do wypisania do e
ld c,2 ;funkcja pisz
call bdos
ret
org 200H
wektory:
db 3,1,2,3,1,2,3
wynik:
ds 1
end
Może wie ktoś jak to zrobić? Z góry dziękuje!