汇编语言再次搜索

时间:2012-03-03 21:24:40

标签: assembly

我正在尝试制作一个程序,将数字输入到一个数组中然后能够在数组中搜索其中一个数字。我可以让它读取并搜索好找到数字,但用户应该是能够再次搜索,我必须将他们的输入与“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部分。

1 个答案:

答案 0 :(得分:0)

为什么每个人都说首先在HLL中写它?

为什么使用WORD尺寸?使用32位处理器的自然尺寸。

这是什么汇编程序?如果它是MASM或任何其他,输入,atow宏或函数?无论哪种方式,您都试图将inString的地址转换为单词而不是其内容

试试这个:

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