【问题标题】:How to Store the elements of array at memory addresses in 8086如何将数组的元素存储在8086中的内存地址
【发布时间】:2019-10-23 15:00:38
【问题描述】:

Here is the question我正在尝试在emu8086中编写一个程序。这个程序是关于内存操作和数组的。内存传输操作必须在数据段完成。而且我必须将我的元素存储在内存地址中。(例如:从 DS:[2000h] 到 DS:[2009h])

    data segment   
    arr db 1,2,3,4,5,6,7,8,9,10  
    ends

code segment  
start:

    xor ax  , ax 
    lea si ,arr

    mov cx , 10   
add: 
    add ax,[si]
    add si,2
    loop add 
ends

我对寻址数组元素感到困惑。

【问题讨论】:

  • 您的数组被声明为字节数组,而您的代码将其视为字数组。这样的不匹配是行不通的。要么将数组声明为 word (dw),要么在代码中使用字节操作。如果您想要一个更好的答案,您可以更新一个问题。

标签: assembly x86-16 emu8086


【解决方案1】:

将数据大小更改为 BYTE 后,总和的计算将正确。

 xor  al, al
 lea  si, arr
 mov  cx, 10
Sum:
 add  al, [si]
 inc  si
 loop Sum

我对寻址数组元素感到困惑。

要寻址内存,您需要设置一个段寄存器并指定一个偏移量(主要使用地址寄存器,如SI、DI 或BX)。
要将数组和总和存储在 DS:[2000h],您必须首先设置DS 段寄存器。并且因为需要同时在原始位置寻址数组,所以需要设置 2 个段寄存器。

mov ax, data    ;Source is the array in the program
mov es, ax
mov ax, 3000h   ;Destination is the designated memory
mov ds, ax

我们可以同时移动数组和计算总和!

 xor  al, al
 lea  si, arr     ;Source offset (using ES)
 mov  di, 2000h   ;Destination offset (using DS)
 mov  cx, 10
MoveAndSum:
 mov  dl, es:[si]
 inc  si
 mov  [di], dl
 inc  di
 add  al, dl
 loop MoveAndSum
 mov  [di], al    ;Store the sum at DS:[200Ah]    ?????

原始任务描述告诉你将总和存储在DS:[2010h]

这不是附图所显示的!

您可能需要写mov [2010h], al 而不是mov [di], al。

【讨论】:

  • 我不认为分配希望他们复制到ds:2000,我认为它希望他们使用data segment语法来声明段从偏移开始2000,或类似的东西。虽然关于设置ds=3000 的部分很奇怪;你通常没有选择。 .exe 程序加载器通常会重写段寄存器的内容。但无论如何,我在 OP 图像的规范中看到的唯一“转移”是计算总和的负载。它实际上没有说“复制”。
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2016-08-21
  • 2012-10-25
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多