首页 > 解决方案 > 在 x86 程序集中将数组传输到寄存器时出现问题

问题描述

我能够组装,但是当我逐步使用 gdb 时,当我尝试将数组中的值移动到寄存器时它会崩溃

我正在组装nasm -f elf32 test.asm 并且我正在与ld -m elf_i386 test.o

section data
    list:
        dw 7, 9, 3, 0
section text
global    _start
          _start:
        
push ebp                               ; prologue
mov ebp, esp                           ; prologue

        mov edx, 1                     ; i = 1
        mov ecx, [edx * 4 + list]      ; ecx = list[i]

        loop:
        mov ebx, [edx * 4 + list]
        cmp ebx,0                      ; if (list[i] = 0)
        jz end                         ; exit loop
        cmp ecx,ebx                    ; ecx - list[i]
        jl if_greater                  ; ecx - list[i] = <0
        inc edx                        ; i++
        jmp loop
        
        if_greater:                    ; if condition block
        mov ecx, [edx * 4 + list]      ; new highest value
        inc edx                        ; i++
        jmp loop

        end: 

        mov esp, ebp                  ; epilogue
        pop ebp                       ; epilogue

我添加了更新的代码。我留下了原始代码。我现在的目标是找到列表中最高的一对,但没有成功。


section data
    list:
        dw 7, 9, 3, 0
section text
global    _start
          _start:
        
push ebp                               ; prologue
mov ebp, esp                           ; prologue

        mov edx, 1                     ; i = 1
        mov ecx, [edx * 4 + list]      ; ecx = list[i]

        loop:
        mov ebx, [edx * 4 + list]
        cmp ebx,0                      ; if (list[i] = 0)
        jz end                         ; exit loop
        cmp ecx,ebx                    ; ecx - list[i]
        jl if_greater                  ; ecx - list[i] = <0
        inc edx                        ; i++
        jmp loop
        
        if_greater:                    ; if condition block
        mov ecx, [edx * 4 + list]      ; new highest value
        inc edx                        ; i++
        jmp loop

        end: 
        mov eax, 1
        xor ebx, ebx
        int 0x80

        mov esp, ebp                  ; epilogue
        pop ebp                       ; epilogue

更新2:我已经删除了序言和尾声。我也改成edx0


section data
    list:
        dd 7, 9, 3, 0
section text
global    _start
          _start:
        

        mov edx, 0                     ; i = 0
        mov ecx, [edx * 4 + list]      ; ecx = list[i]

        loop:
        mov ebx, [edx * 4 + list]
        cmp ebx,0                      ; if (list[i] = 0)
        jz end                         ; exit loop
        cmp ecx,ebx                    ; ecx - list[i]
        jl if_greater                  ; ecx - list[i] = <0
        inc edx                        ; i++
        jmp loop
        
        if_greater:                    ; if condition block
        mov ecx, [edx * 4 + list]      ; new highest value
        inc edx                        ; i++
        jmp loop

        end: 
        mov eax, 1
        xor ebx, ebx
        int 0x80

标签: assemblyx86nasm

解决方案


推荐阅读