2012-03-03 4 views
1

배열에 숫자를 입력 한 다음 숫자 중 하나를 배열에서 검색 할 수있는 프로그램을 만들려고합니다. 숫자 만 찾으면 검색 할 수 있습니다. 나는 다시 "n"과 "N"의 입력을 비교해야한다. 제대로 작동하지 않는 것 같습니다. atow를 사용하는 것이 올바른 입력인지 아닌지는 잘 모르겠지만 여기에 코드가 있습니다.어셈블리 언어 다시 검색

number1   WORD  ? 
anArray   WORD  100 DUP (?) 
count   WORD  ? 
search   WORD  ? 
searchn   BYTE  "n",0 
searchNo   BYTE  "N",0 
prompt1   BYTE  "Enter a number or -1 to quit.", 0 
prompt2   BYTE  "Enter a number to search for", 0 
prompt3   BYTE  "Search for another number Y/N",0 
inString  BYTE  40 DUP (?) 
outMsgLabel  BYTE  "Search Result", 0 
frontOut1  BYTE  6 DUP (?) 
outMsg1   BYTE  " is element" 
rearOut1  BYTE  6 DUP (?),0 
frontOut2  BYTE  6 DUP (?) 
outMsg2   BYTE  " is not in array",0 

searchAgain: input  prompt3, inString, 40 
       atow  inString 
       mov   dx,ax 
       atow  searchn 
       mov   ax,"n" 
       cmp   ax,dx 
       je   end1 
       atow  searchNo 
       mov   ax,"N" 
       cmp   ax,dx 
       je   end1 
       jmp   next 

작동하지 않는 코드의 스 니펫과 .DATA 섹션 만 포함되었습니다.

+0

쓰기를 다음으로 변환 : 그럼 어느 쪽이든, 당신은하지의 내용

이 시도 단어에 inString의 주소를 변환하기 위해 노력하고 있습니다. 그런 다음 디버거를 사용하여 디버깅하십시오. –

+0

저는 디버거를 사용하고 있지만 대학 강의에서 어셈블리 언어를 배우고 있습니다. 내가 C + +로 작성하고 그것을 변환했지만, 그것을 찾을 수 없습니다. inString을 단어로 변환하는 것은 ax 레지스터에 0을 생성하기 때문에 발생합니다. 선생님은 문자열을 비교하거나 문자열을 변환하는 방법을 가르쳐주지 않았습니다. – todaroa

+1

어떤 아키텍처입니까? 그것은 masm에서 i86과 조금 비슷해 보입니다. 그러나'atow' 또는'input'을 인식하지 못합니다 ... –

답변

0

왜 모두가 HLL로 작성한다고 말하고 있습니까?

왜 단어 크기를 사용하고 있습니까? 프로세서 32 비트의 자연적인 크기를 사용하십시오.

어떤 어셈블러입니까? MASM이거나 다른 매크로 또는 함수가 매크로 또는 함수 인 경우? 그것은 먼저 높은 수준의 언어로

prompt3   BYTE "Search for another number Y/N ? >" 
PROMPT3_SIZE equ  $ - prompt3 



SearchAgain: 
    push PROMPT3_SIZE 
    push offset prompt3 
    call WriteToConsole 

    call GetKeyCode 
    cmp  eax, 78   ; N 
    je  end1 
    cmp  eax, 110  ; n 
    je  end1 
    cmp  eax, 65   ; Y 
    je  Continue   
    cmp  eax, 97   ; y 
    je  Continue 

    ; invalid char was entered, do whatever here 
    jmp  SearchAgain  

end1: 
    ; don't want to search again 
Continue: 
    ; search for character 

; ... 
; ... 
; ... 
    push 0 
    call ExitProcess 
WriteToConsole: 
    enter 0, 0 

    push STD_OUTPUT_HANDLE 
    call GetStdHandle 

    push 0 
    push 0 
    push [ebp + 12] 
    push [ebp + 8] 
    push eax 
    call WriteConsole 

    leave 
    ret  4 *2 

GetKeyCode: 
    push STD_INPUT_HANDLE 
    call GetStdHandle 

    push eax 
    call FlushConsoleInputBuffer 

    call crt__getch 
    xor  ecx, ecx  ; zero ecx for non extended key return value 
    test eax, eax 
    jz  @F 
    cmp  eax, 0E0h 
    jnz  quit 
@@: 
    call crt__getch 
    mov  ecx, 1   ; return 1 in ECX if an extended key is pressed 
quit: 
    ret