使用Assembly 8086搜索数组

时间:2012-03-30 20:23:24

标签: assembly x86-16

我正在尝试为一个班级做作业,而且我很困扰这里。我需要做的是搜索指定双字值的双字数组。这就是我现在所拥有的:

; 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

我遇到的问题是程序将运行一切但仍然返回0,即使该值存在于数组中。谁能弄清楚我做错了什么?

提前致谢

1 个答案:

答案 0 :(得分: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
     

...

似乎你根本没有增加ebx。当你忘记在每次在矩阵中添加另一个值时将ebx增加4时,你已经用输入多次覆盖了[ebx]的值。 Soo,你的矩阵,从Adress ebx开始,里面只有一个值。这个是第五个输入数字的值!

你的比较很好。问题不在那里。无论如何,我建议你尝试使用iterration!节省时间并减少编程错误! 您可以使用例如edx(dl只有8位)作为计数器,因为它在此程序中没有其他用途!