EMU8086将值从数组复制到另一个

时间:2019-04-05 16:54:08

标签: arrays emu8086

在我的课程中,我必须编写一个程序,将所有小于1000h的值从一个带符号的16位数字数组(称为inputArray)复制到另一个数组(称为outputArray)。在本练习中,我需要使用字符串指令lodsstos

我作为示例的唯一问题如下:

org 100h
jmp init
value equ 8000h
numbers dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
init: lea SI, numbers
mov CX, (init-numbers)/2
mov DX, 0h
cld
compare: lodsw
cmp AX, value
ja insert
nextElem: loop compare
lea DI, numbers
mov CX, DX
extract: pop AX
stosw
loop extract
end: int 20h
insert: push AX
inc DX
jmp nextElem

1 个答案:

答案 0 :(得分:2)

  

对于我的课程,我必须编写一个程序,该程序从16位 signed 数组中复制所有小于 1000h 的值。数字(称为inputArray)到另一个数组(称为outputArray)。在本练习中,我需要使用字符串说明 los and stos

让我们看一下任务的所有关键要素,这些要素与您收到/发现(我认为)的程序代码有关。

降低签名
因为涉及的数字是带符号的数字,所以您需要使用适当的条件说明。其中包括jl(JumpIfLess)和jg(JumpIfGreater)。示例程序使用ja(JumpIfAbove),适合使用无符号数字!

1000h
只需更改行value equ 8000h

另一个数组
示例程序将结果存储在原始编号的顶部。对于您的任务,您需要定义第二个数组。这个额外的数组必须能够容纳与输入数组相同数量的元素:

inputArray    dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
outputArray   dw 0, 0, 0, 0, 0, 0

您可以使用dup运算符,而不是像上面那样编写它:

inputArray    dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
outputArray   dw 6 dup (0)

成败不负
您获得的程序已经使用了这些说明。


让我们写一个更好的示例程序(通过堆栈保持愚蠢的弯路)。

。如果将数据部分放在代码部分下面,则不再需要jmp init
通过缩进代码使标签脱颖而出。
。也将操作数对​​齐。
避免跳来跳去。不要ja insert而是jna nextElem并把插入说明放在附近。
。避免使用慢速loop指令。 dec cx jnz ...很好地替换它。您甚至可以完全使用另一个计数寄存器(*)。

org 100h
value equ 8000h

  lea  SI, numbers
  mov  CX, (init-numbers)/2
  mov  DX, 0h
  cld
compare:
  lodsw
  cmp  AX, value
  jna  nextElem
  push AX         ;insert
  inc  DX         ;insert
nextElem:
  dec  cx
  jnz  compare
  lea  DI, numbers
                           ;No need to setup CX, just use DX (*)
extract:
  pop  AX
  stosw
  dec  dx                  ;(*)
  jnz  extract
end:
  int 20h

numbers dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h

该如何写。

org 100h

  mov  si, offset inputArray
  mov  di, offset outputArray
  cld
Again:
  lodsw
  cmp  ax, 1000h
  jnl  IsNotLess
  stosw
IsNotLess:
  cmp  si, offset outputArray  ;Arrays must be adjacent for this to work!
  jb   Again

  int  20h

inputArray    dw 8933h, 1240h, 0328h, 99A0h, 0F422h, 0101h
outputArray   dw 6 dup (0)

输出数组将包含5个元素:

  1. 负数8933h
  2. 正数但小于1000h的数字为0328h
  3. 负数99A0h
  4. 负数0F422h
  5. 正数但小于1000h的数字0101h