组件 8086 将元素和数据段相乘



作为我家庭作业的一部分,我需要初始化两个一维数组,每个数组有 10 个 2B 项,将每个偶数项乘以 2。我找到了一些代码,但我不明白在内存中初始化数组的部分内容。

在示例的下一部分,在此查询之后,MOV AX,PODACI是什么意思?

  • 它是否只移动数组TABELA中第一个术语的地址,并在AX中移动TABELA1
  • 或者它移动数组TABELA中的第一个元素,AX中移动TABELA1元素(在我的情况下,由于AX的大小,我有 dw 类型的数据?

如果如上所述使用地址,是否有必要在DATA SEGMENT中仅定义数组(我需要找到最大和最小元素,并根据该计划在数据段中定义min_niz1 dw ?max_niz1 dw ?,如果我使用MOV AX,PODACI,这可能吗)?

MOV SI, OFFSET TABELAMOV DI, OFFSET TABELA1是什么意思,这会在SIDI中移动偏移地址吗,稍后ALBL中会是什么?

PODACI  SEGMENT 'DATA'
TABELA DB 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 27h, 7Fh, 6Fh
TABELA1 DB 3Fh, 05h, 5Bh, 04h, 03h, 6Dh, 7Dh, 27h, 01h, 6Fh     
PODACI  ENDS
PROGRAM SEGMENT 'CODE'
ASSUME CS:PROGRAM,DS:PODACI
START:  MOV AX,PODACI
MOV DS,AX
MOV SI,0
MOV DI, 0
MOV CX, 10 
MOV SI, OFFSET TABELA
MOV DI, OFFSET TABELA1
petlja:   MOV AL, [SI]
MOV BL, [DI] 
CMP AL, BL
JNZ nije
INC DX  
nije:     INC SI
INC DI
loop petlja          

PROGRAM ENDS
END START

作为第二部分,我需要将数组中的偶数项乘以 2,下面这部分代码可能吗?

mov ax,niz1[di]
add ax,ax
mov niz1[di],ax

我不知道这种正确方法是否只使用数组的偶数项,并将新值放回我的数组中? 我尝试使用 emu 8086 执行此操作,但解决方案对我来说并不明显。

even:
MOV DI, 0
mov ax,niz1[di]
add ax
mov niz1[di],ax
inc di
inc di
cmp di,11
jle even:

您学习的程序

在示例的下一部分,在此查询之后,MOV AX,PODACI 是什么意思?

一对指令

mov ax, PODACI
mov ds, ax

用于设置DS段寄存器,使其指向程序的 DATA 部分。

这意味着 MOV SI

、OFFSET TABELA 和 MOV DI,OFFSET TABELA1,这会移动 SI 和 DI 中的偏移地址吗?稍后会在 AL 和 BL 中移动什么?

MOV SI, OFFSET TABELA
MOV DI, OFFSET TABELA1

将加载SIDI,偏移量到两个数组,偏移量在 DATA 部分中。

MOV AL, [SI]
MOV BL, [DI] 

将加载AL,每个数组都有一个字节大小的元素BL

您的任务

我需要初始化两个一维数组,每个数组有 10 个 2B 项,将每个偶数项乘以 2

要使用 10 个 2B 项初始化新数组,请使用DW指令:

niz1 dw 100,200,300,400,500,600,700,800,900,1000

此数组中所有元素的下标为 0, 1, 2, 3, 4, 5, 6, 7, 8, 9。偶
数项是那些数组下标为偶数的元素,因此数组元素 0、2、4、6、8。
由于每个数组元素在内存中占用 2 个字节,因此可以找到这些元素的偏移量为 0、4、8、12、16。请记住,在汇编编程中,方括号(niz1[di])之间的值是内存中的偏移量,而不是像高级编程语言那样的数组下标。

xor di, di        ;Similar to "MOV DI,0".
Even:
shl niz1[di], 1   ;Doubles this element.
add di, 4         ;Goes to next 'even' term.
cmp di, 20        ;Total size of the array.
jb  Even          ;Repeat as long as we're IN the array.

请注意,您的解决方案将数组中的偶数项乘以 2

mov ax,niz1[di]
add ax               !!! typo?
mov niz1[di],ax

很好,但加倍向左移动更好。

祝你好运,把它变成一个工作程序。
(每个程序都需要退出操作系统,这里是DOS...

最新更新