Emu8086 将值从一个数组复制到另一个
Emu8086 copying values from an array to another
对于我的课程作业,我必须编写一个程序,将所有小于 1000h 的值从一个带符号的 16 位数字数组(称为 inputArray
)复制到另一个数组(称为 outputArray
).在本练习中,我需要使用字符串指令 lods
和 stos
.
作为示例,我遇到的唯一问题如下:
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 个元素:
- 负数8933h
- 小于1000h的正数0328h
- 负数99A0h
- 负数0F422h
- 小于1000h的正数0101h
对于我的课程作业,我必须编写一个程序,将所有小于 1000h 的值从一个带符号的 16 位数字数组(称为 inputArray
)复制到另一个数组(称为 outputArray
).在本练习中,我需要使用字符串指令 lods
和 stos
.
作为示例,我遇到的唯一问题如下:
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 个元素:
- 负数8933h
- 小于1000h的正数0328h
- 负数99A0h
- 负数0F422h
- 小于1000h的正数0101h