-1

固定文字列と入力文字列を比較しています。alしかし、入力レジスタが何であるかを理解するのは難しいahです。私はただの初心者で、これはプログラマーにとって苦痛な言語です笑 jk. 助けてください本当にありがとうございます:)

mov dx, offset temp             ;string input
mov ah, 0ah
int 21h     

mov bl, "a"                     ;condition
cmp al, bl 
jne aw

mov dx, offset msgTrue          ;true
mov ah, 09
int 21h  

aw:                             ;false
mov dx, offset msgFalse
mov ah, 09
int 21h 


ret
    msg  db 10, 13, "           *         ************************************       *****$"
    msg1 db 10, 13, "          ***        *            Ticketing System      *        ***$"
    msg2 db 10, 13, "         *****       ************************************         *$" 
    msg3 db 10, 13, "                          ==========================$" 
    msg4 db 10, 13, "                          =  (a)Land               =$" 
    msg5 db 10, 13, "                          =  (b)Water              =$"
    msg6 db 10, 13, "                          =  (c)Air                =$" 
    msg7 db 10, 13, "                          ==========================$" 
    msg8 db 10, 13, "                           Choose Travel Type: $"
    temp db 2, 0, 3 dup("$") 

    msgTrue db 10, 13, "                           You selected Land$"
    msgFalse db 10, 13, "                           Invalid Input$" 
4

2 に答える 2

2

syscall 0Ah (バッファリングされた入力) http://spike.scu.edu.au/~barry/interrupts.html#ah0aを使用するので、読み取ったデータはtemp (バッファ)にあります。

0Ah は STDIN からバッファに n バイトを読み取ります

mov bx, OFFSET buffer バッファのアドレス (ここでは temp) を bx にプッシュします。これは 0Ah に必要です

読み取ったバイト数を修正するには、たとえば使用できますmov byte [bx],15

これも参照してください http://www.fysnet.net/kbbuffio.htm

mov bl, 'a'                     ;condition
cmp al, bl 
jne aw

2 つの 8 ビット値 (char) を比較します。これを参照してくださいhttp://x86.renejeschke.de/html/file_module_x86_id_35.html (AL、AH は 8 ビット、AX は 16 ビット、EAX は 32 ビット (拡張 AX))

8/16/32/64 ビットの命名規則については、 https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#General-purpose_registers_(16-bit_naming_conventions )を参照してください。

これは、入力バッファtempから読み取った入力バイトを読み取って比較するために使用できます。

val DB 'a'
mov al, val                    ;condition
mov bx, OFFSET temp            ; address of temp in bx: bx is a pointer to first byte in temp now
;alternatively you can use  lea bx, [temp] 
add bx, 2                     ; structure of input buffer (here temp) http://spike.scu.edu.au/~barry/interrupts.html#dosbuf
mov dl, byte [bx]              ; writes the byte [bx] points to in dl - [bx] dereferences bx - the byte command treats bx as a char* - see https://www.cs.uaf.edu/2006/fall/cs301/lecture/10_02_pointer.html
cmp al, dl 
jne aw
于 2016-03-03T08:18:20.003 に答える
1

結果は、システム コールに配置するように要求したメモリ内にあります。ラルフの答えを見てください。

次のように入力を確認します。

    mov   dx, offset temp             ; input buffer
    mov   ah, 0ah                     ; buffered input syscall
    int   21h     

    ; select one of two messages to print
    mov   dx, offset msgTrue
    cmp   byte ptr [temp+2], 'a'      ; compare the first byte of user input
    je  .true
    mov   dx, offset msgFalse         ; conditionally skip this instruction
.true:

    mov ah, 09                        ; print string syscall
    int 21h

mov ah/int 0x21コードが 1 回だけ表示され、分岐が 1 つの命令のみをスキップすることに注目してください。cmov最新の CPUでも実行できますが、cmov厄介なことに、即時ソース エンコーディングがありません。

で即値オペランドを使用するだけでなく、肥大化したコードに対する批判については、ラルフの回答のコメントを参照してくださいcmp。アセンブル時の定数を使用する場合も、この方法で使用するレジスタが大幅に少なくなります。


別のオプション ( の代わりにmov dx, offset msgFalse) はadd dx, offset msgFalse - msgTrue、即値オペランドを小さい数にします (imm8 エンコーディングを使用するための -128 .. 127 の範囲内に収まります)。mov dx, imm16ただし、 3 バイト (各 dest レジスタの専用オペコード) であり、 3 バイト (専用オペコードなし)であるため、16 ビット コードではコード バイトを保存しませんadd dx, imm8。これにより、アドレスが 32 ビットである 32 ビット コードでバイトが節約されます。

于 2016-03-03T10:21:07.740 に答える