我对如何循环遍历结构体数组来获取输入并存储它,然后打印结构体中的所有输入感到非常困惑。我有这段代码,我在其中手动访问数组的索引,它确实有效。
.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
这是我手动访问索引时的输出。
这是我使用循环时的输出。 在此输入图片描述
我在这两个代码中看到的唯一区别是 si 寄存器。在第一个代码中,您没有使用它,您使用值来访问内存地址。
我不知道 PutStr 是如何实现的,可能在 io.mac 中,但它似乎正在更改 si 寄存器。