我在使用简单的汇编程序时遇到了麻烦。我不知道我为什么会这样,但是有问题。 任务是:在汇编程序中计算两个数组的标量积(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这是我在汇编编程中的菜鸟,所以不要生气我的愚蠢问题。
答案 0 :(得分:0)
在ciklus:
标签后,您要向dl
添加0x30,然后将dl
添加到j
,此时j >= 0x30
。al
。中断后,您将j
设置为ah
,将0x0
设置为ax >= 0x30
,0x30
。稍后您将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}}寄存器来保存工作值。