user1304088
user1304088

Reputation: 21

Searching an array using Assembly 8086

I'm trying to do an assignment for a class, and I'm pretty stuck here. What I need to do is search an array of doublewords for a specified doubleword value. Here's what I have now:

; 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

The problem I'm having is that the program will run through everything but still return 0, even though the value exists in the array. Can anybody figure out what I'm doing wrong?

Thanks in advance

Upvotes: 2

Views: 5741

Answers (1)

AsamRegnat
AsamRegnat

Reputation: 91

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

....

It seems that you did not increment ebx at all. When you forgotten to increment ebx with 4 each time you have putted another value in the matrix, you have overridden the value of [ebx] several times with your input. Soo, your matrix, that starts at Adress ebx, will have only one value inside. This one is the value of the fifth input number!

Your comparison is good. The Problem it´s not there. Anyway I suggest you try to use iterration instead! Save time and reduces programming errors! You could use for example edx (dl just 8 Bits) as counter, as far at it has no other purposes in this program!

Upvotes: 2

Related Questions