汇编程序任务:两个数组的标量积

时间:2012-03-09 22:21:10

标签: assembly x86 dos

我在使用简单的汇编程序时遇到了麻烦。我不知道我为什么会这样,但是有问题。 任务是:在汇编程序中计算两个数组的标量积(emu 8086) 这是我的代码

    ; multi-segment executable file template.

数据段     ;在这里添加您的数据!     n1 db 1,2,3     n2 db 4,5,6     我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    

结束开始;设置入口点并停止汇编程序。

所以当我一步一步地运行程序时,我会看到ax中的奇怪值。我想要 1x4 2x5 3x6 => 4 10 18保存一些变量并打印到屏幕。

如果有人可以帮助我,我将不胜感激。 P.S这是我在汇编编程中的菜鸟,所以不要生气我的愚蠢问题。

1 个答案:

答案 0 :(得分:0)

ciklus:标签后,您要向dl添加0x30,然后将dl添加到j,此时j >= 0x30al。中断后,您将j设置为ah,将0x0设置为ax >= 0x300x30。稍后您将dl添加到dl,然后将i添加到mul i

所以ax >= 2304, dx = 0实际上是:[dx:ax] = i * ax,它将位于至少(0x30 * 0x30),即mul。更大,取决于[bx],i,j。

的内容

ax之后,您使用值0x200(512)覆盖ax [ah:al]寄存器,无论如何,结果都会丢失。简而言之,您需要先查看保存正在运行的si寄存器,然后再将其用作中断服务代码。

P.S。您可以考虑使用di和{{1}}寄存器来保存工作值。