在我的课程中,我必须编写一个程序,将所有小于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
答案 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个元素: