汇编x86将vlues放入带有循环

时间:2017-05-19 22:33:38

标签: arrays loops assembly x86

我想将数字放在10个长度数组中,但每个数字比最后一个数字大1。 它的意思是:myArray = 0,1,2,3,4,5,6,7,8,9 所以我试过这个:

  

IDEAL
  型号小   堆叠100h

     

DATASEG

     

intArray db 10 dup(0)
    index db 1

     

CODESEG

     

开始:
    mov ax,@ DATA
    mov ds,ax   loopArray:
    mov al,[index]
    添加[intArray + index],al;这是问题     inc [index]
    cmp [index],11
    jb loopArray
  退出:
    mov ax,4c00h
    int 21h
  结束开始

但是我无法将索引添加到[intArray + index],所以我试图将它添加到[intArray + al],但它也不起作用。
我怎样才能每次将索引添加到下一个数组的值?

1 个答案:

答案 0 :(得分:1)

  

myArray = 0,1,2,3,4,5,6,7,8,9。

这些是您希望数组包含的数字。但是,由于您将 index 变量(您将用于索引和存储)初始化为1(使用index db 1),这将导致另一个结果。
只需设置索引:

index db 0

还有另一个理由以这种方式进行设置! 在符号[intArray+index]中,index部分在数组中是偏移。偏移量始终为零。你编写程序的方式,它会在数组后面写第10个值。

  

添加[intArray + index],al;这是问题

你是对的,这就是问题所在。一些汇编程序不会编译它,而其他汇编程序只会添加这两个变量的地址。都不适合你的目的。您需要的是将 index 变量的内容放在寄存器中并使用该操作数组合。

    intArray db 10 dup (0)
    index    db 0
    ...
loopArray:
    movzx    bx, [index]
    mov      [intArray+bx], bl ;Give the BX-th array element the value BL
    inc      [index]
    cmp      [index], 10
    jb       loopArray

使用此代码, index 将从0开始,然后只要索引小于10,循环就会持续。

当然,您可以在不使用索引变量的情况下编写此程序。

    intArray db 10 dup (0)
    ...
    xor      bx, bx            ;This make the 'index' = 0
loopArray:
    mov      [intArray+bx], bl ;Give the BX-th array element the value BL
    inc      bx
    cmp      bx, 10
    jb       loopArray

鉴于数组最初用零填充,您可以替换:

    mov      [intArray+bx], bl ;Give the BX-th array element the value BL

使用:

    add      [intArray+bx], bl ;Give the BX-th array element the value BL

请记住,只有在数组预先填充了零之后才能使用此功能!