Задача ассемблера: скалярное произведение двух массивов - PullRequest
1 голос
/ 10 марта 2012

У меня проблема с простой программой на ассемблере. Я не знаю, что и почему происходит, но есть проблема.Задача: Вычислить скалярное произведение двух массивов в ассемблере (эму 8086). Вот мой код

    ; multi-segment executable file template.

сегмент данных;добавьте свои данные здесь!n1 дБ 1,2,3 n2 дБ 4,5,6 i db?j db?

k dw ?
pkey db "press any key...$"

заканчивается

сегмент стека dw 128 dup (0) заканчивается

начало сегмента кода:;задать регистры сегментов: mov ax, data mov ds, ax mov es, ax

mov al,00h
mov ah,02h

mov ch,00h
mov cl,03h

mov bx,offset n1
ciklus:

mov dl,[bx]
;add dl,30h


mov j,0d

add j,dl
int 21h
mov al,j
mov ah,0h


inc bx
inc bx
inc bx
mov dl,[bx]
;add dl,30h

mov i,0d
add i,dl
mul i

mov k,ax


mov al,00h
mov ah,02h
int 21h



dec bx
dec bx
dec bx

inc bx



loop ciklus

lea dx, pkey
mov ah, 9
int 21h        ; output string at ds:dx

; wait for any key....    
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h    

end

end start;установите точку входа и остановите ассемблер.

Поэтому, когда я запускаю программу шаг за шагом, я вижу странные значения в оси.Я хочу, чтобы 1x4 2x5 3x6 => 4 10 18 сохранил в некоторой переменной и распечатал на экран.

Если кто-то может мне помочь, я буду благодарен.PS Я новичок в программировании на ассемблере, так что не сердись на мой глупый вопрос.

1 Ответ

0 голосов
/ 10 марта 2012

После метки ciklus: вы добавляете 0x30 к dl, затем добавляете dl к j, поэтому j >= 0x30 на данный момент.После прерывания вы устанавливаете al на j, а ah на 0x0, поэтому ax >= 0x30.Позже вы добавляете 0x30 к dl, затем добавляете dl к i.

Таким образом, mul i эффективно: [dx: ax] = i * ax, который будет в минимум (0x30 * 0x30), т. Е. ax >= 2304, dx = 0.Больше, в зависимости от содержимого [bx], i, j.

После mul вы перезаписываете регистр ax значением: 0x200 (512), в любом случае, так что результатыпотерял.Короче говоря, вам нужно взглянуть на сохранение рабочего регистра ax [ah:al], прежде чем использовать его в качестве служебного кода прерывания.

PS Возможно, вы захотите использовать si и * 1032.* регистры для сохранения рабочих значений.

...