-2
구조체 배열에 액세스하려고하는데 잘 작동하지 않는 것 같습니다. 문자열 'firstname'을 기반으로 구조체 배열을 검색하려고했습니다. .구조체 배열에 액세스 및 추가하기
menu db 10, '------MENU------', 10, '1. Add Student', 10, '2. Delete Student', 10, '3. Delete All', 10, '4. Search Student', 10, '5. Display All', 10, '6. Exit', 10
menulen equ $-menu
namep db 'Enter name: '
nameplen equ $-namep
fnamep db 'Enter firstname: '
fnameplen equ $-fnamep
lnamep db 'Enter lastname: '
lnameplen equ $-lnamep
agep db 'Enter age: '
ageplen equ $-agep
unitsp db 'Enter units enrolled: '
unitsplen equ $-unitsp
fullp db 'Sorry, the record is already full.', 10
fullplen equ $-fullp
record db '----Student Record----', 10
recordlen equ $-record
deleteallp db '----Deleted all Record----', 10
deleteallplen equ $-deleteallp
deleteerrorp db '----Student not in the record----', 10
deleteerrorplen equ $-deleteerrorp
delete db 'Deleted ', 10
deletelen equ $-delete
space db ' '
spacelen equ $-space
newline db '', 10
newlinelen equ $-newline
printfname db 'First name: '
printfnamelen equ $-printfname
printlname db 'Last name: '
printlnamelen equ $-printlname
printage db 'Age: '
printagelen equ $-printage
printunits db 'Number of units enrolled: '
printunitslen equ $-printunits
student equ 88
firstname equ 0
lastname equ 40
age equ 80
units equ 84
array_size equ 5
choice resb 1
x resb array_size*student
size resb 1
temp resb 1
string resb 40
mov eax, 4
mov ebx, 1
mov ecx, namep
mov edx, nameplen
int 80h
mov eax, 3
mov edx, 0
mov ecx, string
mov edx, 80
int 80h
mov byte[temp], 0
getstudentloop:
mov al, byte[size]
cmp byte[temp], al
je studentnotfound
mov esi, string
mov ecx,esi
imul ecx,[temp]
mov edi, [ecx+x+student+firstname]
cld
repe cmpsb
dec esi
dec edi
jz studentdelete
inc byte[temp]
jmp getstudentloop
studentdelete:
mov ecx,esi
imul ecx,[temp]
mov word[ecx+x+student+firstname], 0
mov ecx,esi
imul ecx,[temp]
mov word[ecx+x+student+lastname], 0
mov ecx,esi
imul ecx,[temp]
mov word[ecx+x+student+age], 0
mov ecx,esi
imul ecx,[temp]
mov word[ecx+x+student+units], 0
mov eax, 4
mov ebx, 1
mov ecx, delete
mov edx, deletelen
int 80h
dec byte[size]
jmp menustart
studentnotfound:
mov eax, 4
mov ebx, 1
mov ecx, deleteerrorp
mov edx, deleteerrorplen
int 80h
jmp menustart
문자열 firstname을 가져올 수 없으므로 비교할 때 실패합니다. 배열의 배열에 추가하는 방법을 잘 모르겠습니다. 이전에 추가 한 요소를 덮어 쓰면서 전체 배열을 마지막으로 추가 한 요소로 바꾸기 때문입니다. 이 일을 제대로하고 있는지 확실하지 않습니다.
cmp byte[size], 5
jge full
mov eax, 4
mov ebx, 1
mov ecx, fnamep
mov edx, fnameplen
int 80h
mov eax, 3
mov ebx, 0
mov ecx,esi
imul ecx,[size]
lea ecx,[ecx+x+student+firstname]
mov edx, 20
int 80h
mov eax, 4
mov ebx, 1
mov ecx, lnamep
mov edx, lnameplen
int 80h
mov eax, 3
mov ebx, 0
mov ecx,esi
imul ecx,[size]
lea ecx,[ecx+x+student+lastname]
mov edx, 20
int 80h
mov eax, 4
mov ebx, 1
mov ecx, agep
mov edx, ageplen
int 80h
mov eax, 3
mov ebx, 0
mov ecx,esi
imul ecx,[size]
lea ecx,[ecx+x+student+age]
mov edx, 3
int 80h
mov eax, 4
mov ebx, 1
mov ecx, unitsp
mov edx, unitsplen
int 80h
mov eax, 3
mov ebx, 0
mov ecx,esi
imul ecx,[size]
lea ecx,[ecx+x+student+units]
mov edx, 3
int 80h
add byte[size], 1
jmp menustart
, 당신은 edx' 두 번'설정, 쓰기,. 나는 그것이 당신의 문제라고 생각하지 않지만 어쨌든 그것을 고치고 싶어 할 것입니다 ... –
구조가 무엇인지 우리에게 보여주지 않았고, 코드는 부품을 잃어 버렸기 때문에 우리는 그것을 컴파일하고 시도 할 수 없습니다. 디버거를 사용하여 의도하지 않은 프로그램이 어디에 있는지 확인하십시오. 다른 사람들에게 도움을 원하면 코드에 주석을 달아주십시오. – Jester
지금 당장 문제가 해결되는 유일한 부분은 비교 목적으로 edi에 변수를 넣는 것입니다. mov ecx, 학생 imul ecx, [temp] mov edi, [x + ecx + firstname] –