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
Benötigt 'Hausaufgaben'-Tag? –
Tag hinzugefügt, danke. – user1304088
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