Ошибка языка ассемблера - PullRequest
0 голосов
/ 28 марта 2012

Я пытался отладить свою программу, но всегда кажется, что она застревает, когда я вызываю свою функцию.Я получаю сообщение об ошибке:

«Необработанное исключение в 0x0018fed8 в windows32.exe: 0xC0000005: нарушение доступа.»

Я попытался исследовать, и я понял, что этоошибка стека.Есть ли другие возможности?

    .586
.MODEL FLAT
INCLUDE io.h
.STACK 4096     

.DATA           ; reserve storage for data
number1         WORD        ?
anArray         WORD        100 DUP (?)
count           WORD        ?
search          WORD        ?
prompt1         BYTE        "Enter a number or -1 to quit.", 0
prompt2         BYTE        "Enter a number to search for", 0
prompt3         BYTE        "Search for another number Y/N",0
inString        BYTE        40 DUP (?)
searchString    BYTE        16 DUP (?)
outMsgLabel     BYTE        "Search Result", 0
frontOut1       BYTE        6 DUP (?)
outMsg1         BYTE        " is element"
rearOut1        BYTE        6 DUP (?),0
frontOut2       BYTE        6 DUP (?)
outMsg2         BYTE        " is not in array",0

EXTERN          function1:PROC

.CODE           ; start of main program code
_MainProc       PROC
                lea         ebx, anArray
                mov         cx, count
moveThrough:    input       prompt1, inString, 40   ; read ASCII characters
                atow        inString                ; convert to integer
                cmp         ax,0                    ; check for -1
                jl          next
                mov         [ebx], eax              ; store in memory
                add         ebx,2                   ; move to next location in array
                inc         ecx
                cmp         ecx,50                  ; check to make sure array isn't over 50
                je          next
                jmp         moveThrough             ; jump to add more numbers


next:           lea         ebx, anArray            ; get address of array
                mov         count, cx
                input       prompt2, inString, 40   ; prompt for number to search for
                atow        inString
                mov         dx,ax
                mov         cx,count                ; prep cx to be the counter
                lea         eax, anArray
                push        eax
                push        edx
                push        ecx
                call        function1
                add         esp,6
                cmp         eax,0
                je          notThere
                jmp         equalTo

notThere:       wtoa        frontOut2, search
                output      outMsgLabel,frontOut2   ; output message
                jmp         searchAgain

equalTo:        wtoa        frontOut1, search
                wtoa        rearOut1, ax
                output      outMsgLabel,frontOut1   ; output message
                mov         cx,count
                jmp         searchAgain



searchAgain:    input       prompt3, searchString, 16 ; prompt for search again input
                cmp         searchString,"n"          ; check for n
                je          end1
                cmp         searchString,"N"          ; check forN
                je          end1
                jmp         next

end1:


                mov         eax, 0                  ; exit with return code 0
                ret
_MainProc       ENDP
                END                                 ; end of source code

.586
.MODEL FLAT
.CODE

;void function1(int count, int search, int array[])
;outputs whether the search is in the array
function1       PROC
                push        ebp         
                mov         ebp,esp
                push        ebx
                push        ecx
                push        edx
                push        esi
                mov         ecx,[ebp]
                mov         edx,[ebp+2]
                mov         esi,[ebp+4]

arraySearch:    mov         ax, dx                      
                cmp         [esi],ax                ; check if number is in array
                je          equalTo                 
                add         ebx,2                   ; move to next number in array
                loop        arraySearch             ; loop back to top

notThere:       pop         esi
                pop         edx
                pop         ecx
                pop         ebx
                mov         ax,0
                ret

equalTo:        pop         esi
                pop         edx
                pop         ecx
                pop         ebx
                inc         cx
                mov         ax,cx
                ret

                ret
function1       ENDP

END

Ответы [ 2 ]

0 голосов
/ 29 июня 2012
  1. Почему вы добавляете 6 в esp после вызова функции1? Это 32-битная сборка, а стек выровнен по DWORD, вы добавили 3 32-битных регистра, поэтому вам нужно добавить 12 в esp после вызова функции 1.

  2. В функции 1 вы устанавливаете кадр стека с помощью:

    push ebp

    mov ebp, esp

Где вы взяли ebp и восстановили указатель стека? Эти 2 ошибки запутают вашу программу!

О, и это, как говорится, параметры вашей функции начинаются с [ebp + 8] и для каждого параметра добавляют 4 к этому смещению. 1-й параметр = [ebp + 8] 2nd = [ebp + 12] 3-й = [ebp + 16] и т.д ...

0 голосов
/ 28 марта 2012

Ожидает ли atow NULL завершенную строку случайно? 0xC0000005 - это ошибка памяти, которая также может быть вызвана записью в не принадлежащую вам память, записью многобайтового значения в невыровненное местоположение (например, перемещение 32-разрядного значения в нечетный адрес памяти) и т. Д. не ограничивается ошибками, связанными со стеком.

Обновление Должна ли следующая строка в function корректировать esi вместо ebx?

            add         ebx,2                   ; move to next number in array

Я не читал X86 в течение достаточно долгого времени, поэтому моя память о взаимодействиях регистров немного размыта.

Обновление 2 Ключевое слово EXTERN говорит ассемблеру искать в другой библиотеке? EXTERN обычно означает «ищите где-нибудь еще символ» . Я, честно говоря, могу сказать, что я никогда не работал ни с чем, кроме отдельных узлов в сборке. В основном я вижу дизассемблированный код. Программа может прыгнуть в космос, если она ожидает ветвления куда-то нелокальное. Какой ассемблер вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...