程序集8086乘以偶数元素和数据段

时间:2018-02-03 13:43:42

标签: arrays assembly emu8086

作为我作业的一部分,我需要初始化两个一维数组,每个都有10个2B术语,将每个偶数项乘以2.我找到了一些代码,但我不理解在内存中初始化数组的部分。

在下一部分示例中,在此问题之后,MOV AX,PODACI是什么意思?

  • 是否仅移动TABELA
  • 中数组TABELA1AX中第一个字词的地址
  • 或它移动TABELA中数组TABELA1AX中的第一个元素(在我的情况下是可能的,因为AX的大小,我有dw类型数据?)

是否有必要在DATA SEGMENT中仅定义数组,如果上面使用了地址(我需要找到max和min元素,并根据该计划同时定义min_niz1 dw ?和{{1在数据段中,如果我使用max_niz1 dw ?),那可能吗?

MOV AX,PODACIMOV SI, OFFSET TABELA是什么意思,会移动MOV DI, OFFSET TABELA1SI中的偏移地址以及DI和{{1}中的偏移地址以后?

AL

作为第二部分,我需要将数组中的术语乘以2,这可能与下面这部分代码有关吗?

BL

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

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

1 个答案:

答案 0 :(得分:1)

你学习的课程

  

在下一部分示例中,在此问题之后,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加载到数组中的两个数组,偏移量的偏移量。

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

将使用每个数组的一个字节大小的元素加载ALBL

你的任务

  

我需要初始化两个一维数组,每个数组都有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。请记住,在汇编编程中,方括号之间出现的值({{1} }} 内存中的偏移量而不是高级编程语言中的数组下标。

niz1[di]

请注意,您的解决方案是将数组中的术语乘以2

  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.

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

祝你好运,将其变成一个有效的计划 (每个程序都需要退出操作系统,这是它的DOS ...)