2014-12-01 7 views
-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 
+0

, 당신은 edx' 두 번'설정, 쓰기,. 나는 그것이 당신의 문제라고 생각하지 않지만 어쨌든 그것을 고치고 싶어 할 것입니다 ... –

+0

구조가 무엇인지 우리에게 보여주지 않았고, 코드는 부품을 잃어 버렸기 때문에 우리는 그것을 컴파일하고 시도 할 수 없습니다. 디버거를 사용하여 의도하지 않은 프로그램이 어디에 있는지 확인하십시오. 다른 사람들에게 도움을 원하면 코드에 주석을 달아주십시오. – Jester

+0

지금 당장 문제가 해결되는 유일한 부분은 비교 목적으로 edi에 변수를 넣는 것입니다. mov ecx, 학생 imul ecx, [temp] mov edi, [x + ecx + firstname] –

답변

0

a. SIZE를 초기화하는 것을 잊었습니다! 당신은 단지 그것을 정의 ...

b. SIZE 및 TEMP를 바이트로 정의했습니다.

size resb 1 
temp resb 1 

그러나 다음 코드는 이중 단어를 필요로합니다. 이것은 메모리 피연산자가 관련되어있을 때 IMUL 명령의 요구 사항입니다!

imul ecx,[temp] 
imul ecx,[size] 

그래서 단순히 전혀`ebx` 당신의 첫 sys_read에서

size resd 1 
temp resd 1 

mov dword[size], 0 
mov dword[temp], 0