2012-03-30 133 views
2

我正在嘗試爲一個類做一個任務,而且我很困難。我需要做的是搜索指定雙字值的雙字數組。這是我現在有:使用程序集搜索一個數組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 

我遇到的問題是,該方案將通過一切運行,但仍然返回0,即使數值數組中存在。任何人都可以弄清楚我做錯了什麼?

在此先感謝

+1

需要'家庭作業'標籤嗎? – 2012-03-30 20:29:38

+0

添加標籤,謝謝。 – user1304088 2012-03-30 20:37:35

+0

在'_start'部分,在所有這些'mov [ebx],eax'之後,你不會增加'ebx',所以你把所有的輸入數據都放到第一個dword上(這本身並不是問題,因爲你已經保留了5 DWORD)。 這是一種預感,但可能是您將您的堆棧與RET地址一起取下。 「數組」是一個常數,不要將地址拖放到堆棧中,直接在任何地方使用它的地址(消除一個可能的錯誤,稍後可以添加它),並嘗試將參數傳遞給通過寄存器搜索(我看到了2個參數)。 – karatedog 2012-03-30 21:01:23

回答

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的。當您忘記每次在矩陣中輸入另一個值時用4遞增ebx,您已經多次輸入了[ebx]的值。所以,你的矩陣開始於Adress ebx,它只有一個值。這一個是第五個輸入數字的值!

你的對比很好。問題不在那裏。無論如何,我建議你嘗試使用iterration代替!節省時間並減少編程錯誤! 你可以使用例如edx(dl只有8位)作爲計數器,至於它在這個程序中沒有其他目的!