Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 数据被复制到2个数组中_Assembly_X86 16 - Fatal编程技术网

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也没有意义。