TASM Assembly - 如何循环获取输入并打印结构数组

问题描述 投票:0回答:1

我对如何循环遍历结构体数组来获取输入并存储它,然后打印结构体中的所有输入感到非常困惑。我有这段代码,我在其中手动访问数组的索引,它确实有效。

.model small
.stack 100h
.data
    Person struc
        name db 10 DUP(0)
        password db 10 DUP(0)
    Person ends

    people Person 10 DUP(<>)

    prompt db 'Enter your name: ', 0
    prompt2 db 13, 10, 'Enter password: ', 0
    res db 13, 10, 'Your name is: ', 0
    res2 db 13, 10, 'Your password is: ', 0
.code

include io.mac

main proc
    mov ax, @data
    mov ds, ax

    mov si, 0
    ; First person (index 0)
    PutStr prompt
    GetStr people[0].name
    PutStr prompt2
    GetStr people[0].password
    PutCh 0Ah

    ; Second person (index 1)
    PutStr prompt
    GetStr people[20].name
    PutStr prompt2
    GetStr people[20].password
    PutCh 0Ah

    ; Third person (index 2)
    PutStr prompt
    GetStr people[40].name
    PutStr prompt2
    GetStr people[40].password
    PutCh 0Ah

    ; Print first person's info (index 0)
    PutStr res
    PutStr people[0].name
    PutStr res2
    PutStr people[0].password
    PutCh 0Ah

    ; Print second person's info (index 1)
    PutStr res
    PutStr people[20].name
    PutStr res2
    PutStr people[20].password
    PutCh 0Ah

    ; Print third person's info (index 2)
    PutStr res
    PutStr people[40].name
    PutStr res2
    PutStr people[40].password
    PutCh 0Ah

    mov ax, 4C00h
    int 21h

main endp
end main

但问题是我不想手动输入所有这些,所以我尝试做一个循环以使事情变得更容易......但事实并非如此。这是我的代码:

.model small
.stack 100h
.data
    Person struc
        name db 10 DUP(0)
        password db 10 DUP(0)
    Person ends

    people Person 10 DUP(<>)

    prompt db 'Enter your name: ', 0
    prompt2 db 13, 10, 'Enter password: ', 0
    res db 13, 10, 'Your name is: ', 0
    res2 db 13, 10, 'Your password is: ', 0
.code

include io.mac

main proc
    mov ax, @data
    mov ds, ax

    mov cx, 3
    mov si, 0

    loop_input:
        PutStr prompt
        GetStr people[si].name
        PutStr prompt2
        GetStr people[si].password
        PutCh 0Ah

        add si, size Person ; size = 20
        loop loop_input

    mov cx, 3
    mov si, 0
    loop_output:
        PutStr res
        PutStr people[si].name
        PutStr res2
        PutStr people[si].password
        PutCh 0Ah

        add si, size Person ; size = 20
        loop loop_output


    mov ax, 4C00h
    int 21h

main endp
end main

这是我手动访问索引时的输出。

手动访问索引

这是我使用循环时的输出。 在此输入图片描述

assembly tasm
1个回答
0
投票

我在这两个代码中看到的唯一区别是 si 寄存器。在第一个代码中,您没有使用它,您使用值来访问内存地址。
我不知道 PutStr 是如何实现的,可能在 io.mac 中,但它似乎正在更改 si 寄存器。

© www.soinside.com 2019 - 2024. All rights reserved.