我正在尝试为一个班级做作业,而且我很困扰这里。我需要做的是搜索指定双字值的双字数组。这就是我现在所拥有的:
; 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,即使该值存在于数组中。谁能弄清楚我做错了什么?
提前致谢
答案 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位)作为计数器,因为它在此程序中没有其他用途!