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

Emu8086 copying values from an array to another

对于我的课程作业,我必须编写一个程序,将所有小于 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

For my coursework, I have to write a program that copies all the values lower than 1000h from an array of signed 16-bit numbers (called inputArray) to another array (called outputArray). In this exercise, I'm required to use the string instructions lods and stos.

让我们看看您的任务的所有关键要素与您 received/found(我认为).

的程序代码相关的内容

.更低签名
因为涉及到的数都是有符号数,所以需要使用合适的条件指令。这些包括 jl (JumpIfLess) 和 jg (JumpIfGreater)。示例程序使用了 ja (JumpIfAbove) 适合处理 unsigned 数字!

.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)

.lods 和 stos
你得到的程序已经使用了这些指令。


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

。如果将数据部分放在代码部分下方,则不再需要 jmp init
.通过缩进代码使标签突出。
.也对齐操作数。
.避免跳来跳去。不要 ja insert 而是 jna nextElem 并将插入说明放在附近。
.Avoid the slow loop instruction. 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