Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 访问和添加结构数组_Assembly_X86_Structure - Fatal编程技术网

Assembly 访问和添加结构数组

Assembly 访问和添加结构数组,assembly,x86,structure,Assembly,X86,Structure,我正在尝试访问我的结构数组,它似乎工作不好,下面是我的代码,用于尝试根据字符串“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 name

我正在尝试访问我的结构数组,它似乎工作不好,下面是我的代码,用于尝试根据字符串“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

a。你忘了初始化大小!你只定义了它

b。您已将大小和温度定义为字节

size resb 1
temp resb 1
但是下面的代码需要一个双字。当涉及内存操作数时,这是IMUL指令的要求

imul ecx,[temp]
imul ecx,[size]
那么就写吧

size resd 1
temp resd 1

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

在您的第一次系统读取中,您设置了两次
edx
,而
ebx
根本没有设置。我不认为这是您的问题,但您可能希望修复它…您甚至没有向我们展示结构是什么样的,代码缺少部分,因此我们无法编译和尝试它。使用调试器,查看您的程序在哪里执行您不打算执行的操作。另外,如果希望其他人帮助,请对代码进行注释。我现在已经修复了它,现在唯一遇到问题的部分是将变量放入edi中,以便进行比较。mov-ecx,学生imul-ecx,[temp]mov-edi,[x+ecx+firstname]