Assembly 数据被复制到2个数组中
因此,我尝试创建一个简单的程序,将插入的数据复制到数组中:Assembly 数据被复制到2个数组中,assembly,x86-16,Assembly,X86 16,因此,我尝试创建一个简单的程序,将插入的数据复制到数组中: .model small .stack 100 .data i db 0 j db 0 first db 0 dup(9) last db 0 dup(9) .code mov ax, data mov ds, ax mov es, ax Loop1: mov ah, 1 int 21h mov bl, i mov bh, 0 mo
.model small
.stack 100
.data
i db 0
j db 0
first db 0 dup(9)
last db 0 dup(9)
.code
mov ax, data
mov ds, ax
mov es, ax
Loop1:
mov ah, 1
int 21h
mov bl, i
mov bh, 0
mov ah, 0
mov first[bx], al
add i, 1
jmp Loop1
但是,当我运行程序并检查变量的状态时,数据也会自动复制到数组“last”中,即使没有任何代码告诉程序这样做
有什么想法吗
观察结果“……数据也被自动复制到数组‘last’中,即使没有任何代码告诉程序这样做。”是正确的,因为您实际上已将两个标签放在同一位置的第一个和最后一个
当使用dup
运算符以获取某个数据的多个副本时,必须在dup
运算符之前指定计数,并在括号之间指定要重复的值
first db 9 dup (0)
last db 9 dup (0)
这将产生以下结果,为9个输入字节留出空间:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
^ ^
first
last
如果计数为2,您将得到:
0, 0, 0, 0
^ ^
first
last
0, 0
^ ^
first
last
如果计数为1,您将得到:
0, 0, 0, 0
^ ^
first
last
0, 0
^ ^
first
last
但是你得到的计数是错误的0:
?
^
first
last
因此,写入第一个[bx]也写入最后一个[bx]
您不希望输入的内容超过缓冲区可以加载的内容! 您当前的代码构成了一个无限循环。
考虑到输入缓冲区有9个字节的空间,您需要将迭代次数限制为这么多。使用一个计数器变量,如
mov cx,9
,随着每次迭代递减,当它达到0时,停止循环
mov cx, 9
Loop1:
mov ah, 01h
int 21h
mov bl, i
mov bh, 0
mov first[bx], al
add i, 1
dec cx
jnz Loop1
一种优化的方法将计数器和偏移地址放在一个寄存器中。您可以在BX
、SI
和DI
之间进行选择。还有BP
,但是你必须修改段寄存器。不知道你能不能做到
xor bx, bx
Loop1:
mov ah, 01h
int 21h
mov first[bx], al
inc bx
cmp bx, 9
jb Loop1
正如您所见,实际上不需要使用基于内存的索引变量i。您可能需要
9dup(0)
,而不是相反。而且,你的循环是无限的。你的大部分循环都是浪费指令。只需在寄存器中保留一个计数器或指针,而不是每次迭代都存储/重新加载和重新执行零扩展。将AH交替设置为1和0也没有意义。