2012-03-30 4 views
2

Ich versuche, eine Aufgabe für eine Klasse zu tun, und ich bin hier ziemlich fest. Was ich tun muss, ist ein Array von Doppelwörtern für einen bestimmten Doppelwortwert zu suchen. Hier ist, was ich habe jetzt:Suche ein Array mit Assembly 8086

; DriverSub assembly language program: SUB adds two numbers pushed by Driver and displays SUM 
; Author: Daniel Strien 
; Using Code from: RSzabo 
; Date: 3/29/2012 



.386 
.MODEL FLAT 

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD 



INCLUDE io.h   ; header file for input/output 

cr  EQU  0dh  ; carriage return character 
Lf  EQU  0ah  ; line feed 


.STACK 4096   ; reserve 4096-byte stack 


.DATA     ; reserve storage for data 

number12 DWORD ? 
array DWORD 5 DUP (?) 
prompt1 BYTE "Enter first number: ", 0 
prompt2 BYTE "Enter another number: ", 0 
prompt3 BYTE "Enter a number to search for: ", 0 
string BYTE 13 DUP (?) 

label1 BYTE cr, Lf, "The value was found at Position (0 if not found): "  
pos  BYTE 16 DUP (?) 

     BYTE cr, Lf, 0 




.CODE       ; start of main program code 

_start: 

lea ebx, array  ; get address of array 

    output prompt1   ; prompt for first number 
    input string,13  ; read ASCII characters 
    atod string   ; convert to integer 
    mov [ebx], eax  ;move the input to the array 

output prompt2   ; repeat for second number 
    input string, 13 
    atod string 
    mov [ebx], eax  ;move the input to the array 

output prompt2   ; repeat for third number 
    input string, 13 
    atod string 
    mov [ebx], eax  ;move the input to the array 

output prompt2   ; repeat for fourth number 
    input string, 13 
    atod string 
    mov [ebx], eax  ;move the input to the array 

output prompt2   ; repeat for fifth(last) number 
    input string, 13 
    atod string 
    mov [ebx], eax  ;move the input to the array 

push ebx ;pushing the array adress to the stack 

output prompt3  ; get search number 
input string, 13 
atod string 
push eax 


    lea eax, number12 
    push eax 
    call search 

    dtoa pos, number12  ; convert to ASCII characters 
    output label1   ; output label and position 

    INVOKE ExitProcess, 0 ; exit with return code 0 


PUBLIC _start     ; make entry point public 



search  PROC NEAR32 ; add two words passed on the stack 
        ; return the sum in the EAX register 
     push ebp    ; save EBP 
     mov ebp,esp   ; establish stack frame 

;move search value to eax 
mov eax, [ebp+12] 


     ;compare values to the user input 
    mov ebx, [ebp+16]  ; move array adress to EBX 
    mov ecx, [ebx]  ;move first element to ECX 
    cmp ecx, eax  ;comparing search number to the first value in the array 
    je first    ;If equal return the position. 

    mov ecx, [ebx+4]  ;move first element to ECX 
    cmp ecx, eax  ;comparing search number to the second value in the array 
    je second   ;If equal return the position. 

    mov ecx, [ebx+8] 
    cmp ecx, eax ;comparing search number to the third value in the array 
    je third    ;If equal return the position. 

    mov ecx, [ebx+12] 
    cmp ecx, eax  ;comparing search number to the fourth value in the array 
    je fourth    ;If equal return the position. 

    mov ecx, [ebx+16] 
    cmp ecx, eax  ;comparing search number to the fifth value in the array 
    je fifth    ;If equal return the position. 
    jmp none 

first:     ;returns position 1 
    mov eax, 1  
    jmp done 

second:    ;returns position 2 
    mov eax, 2 
    jmp done 

third:     ;returns position 3 
    mov eax, 3 
    jmp done 

fourth:    ;returns position 4 
    mov eax, 4 
    jmp done 

fifth:     ;returns position 5 
    mov eax, 5 
    jmp done 

none:     ;returns 0 if the search value is not found. 
    mov eax, 0 
    jmp done 

done: 
    mov ebx,[ebp+8] 
    mov [ebp],eax 

     pop ebp    ; restore EBP 
     ret 12     ; return 

search  ENDP 
END        ; end of source code 

Das Problem, das ich habe, ist, dass das Programm durch alles laufen wird, aber immer noch 0 zurück, auch wenn der Wert im Array vorhanden ist. Kann jemand herausfinden, was ich falsch mache?

Vielen Dank im Voraus

+1

Benötigt 'Hausaufgaben'-Tag? –

+0

Tag hinzugefügt, danke. – user1304088

+0

Im '_start'-Abschnitt, nach all diesen' mov [ebx], eax', erhöhen Sie nicht 'ebx', also setzen Sie alle Eingabedaten auf das erste dword (das ist kein Problem für sich, wie Sie es reserviert haben 5 DWORD dafür). Es ist eine Ahnung, aber es ist möglich, dass Sie Ihren Stack zusammen mit der RET-Adresse fubaring sind. Das 'array' ist eine Konstante, push/pop nicht seine Adresse to-and-from-stack, verwenden Sie seine Adresse direkt überall (Beseitigung eines möglichen Fehlers, können Sie es später wieder hinzufügen), und versuchen, Ihre Parameter an 'Suche 'durch Register (ich sah 2 Parameter). – karatedog

Antwort

2
lea ebx, array  ; get address of array 

output prompt1   ; prompt for first number 
input string,13  ; read ASCII characters 
atod string   ; convert to integer 
mov [ebx], eax  ;move the input to the array 

output prompt2   ; repeat for second number 
input string, 13 
atod string 
mov [ebx], eax  ;move the input to the array 

....

Es scheint, dass Sie überhaupt nicht ebx erhöht hat. Wenn Sie vergessen haben, ebx jedes Mal um 4 zu erhöhen, wenn Sie einen anderen Wert in die Matrix eingegeben haben, haben Sie den Wert von [ebx] mehrmals mit Ihrer Eingabe überschrieben. Sooo, deine Matrix, die bei Adresse ebx beginnt, wird nur einen Wert haben. Dies ist der Wert der fünften Eingangsnummer!

Ihr Vergleich ist gut. Das Problem ist nicht da. Wie auch immer, ich schlage vor, Sie versuchen stattdessen, iterration zu verwenden! Sparen Sie Zeit und reduzieren Sie Programmierfehler! Du könntest zum Beispiel edx (dl nur 8 Bits) als Zähler verwenden, soweit es bei diesem Programm keine anderen Zwecke hat!