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,即使數值數組中存在。任何人都可以弄清楚我做錯了什麼?
在此先感謝
需要'家庭作業'標籤嗎? – 2012-03-30 20:29:38
添加標籤,謝謝。 – user1304088 2012-03-30 20:37:35
在'_start'部分,在所有這些'mov [ebx],eax'之後,你不會增加'ebx',所以你把所有的輸入數據都放到第一個dword上(這本身並不是問題,因爲你已經保留了5 DWORD)。 這是一種預感,但可能是您將您的堆棧與RET地址一起取下。 「數組」是一個常數,不要將地址拖放到堆棧中,直接在任何地方使用它的地址(消除一個可能的錯誤,稍後可以添加它),並嘗試將參數傳遞給通過寄存器搜索(我看到了2個參數)。 – karatedog 2012-03-30 21:01:23