0

;文字を読み取って保存し、大文字に変換した後、逆の順序で印刷するために、このプログラム(Intel 8086アセンブリ)を作成しました。(sub AL、20h)を使用して大文字に変換できることは知っていますが、条件付き(IF)ループをどのように配置しますか?

org 100h
mov BX, 0800h
mov DS, BX      ;Set segment register
mov BX, 0000h   ;Set offset register
mov CX, 0       ;Set counter to 0      

;mov CH, 0

readwrite:      ;Top of read/write loop
mov AH, 01h     ;Get ready to read a character
int 21h         ;Read character into AL 

;jb readwrite

mov [BX], AL    ;Move AL into memory at DS:BX

add CX, 1       ;Increment Counter 
add BX, 1       ;Increment offset      

cmp AL, '$'     ;Compare entered to $
jg readwrite    ;if (C > 0) loop



;Reverse Printing

mov BX, 0800h
mov DS, BX      ;Set segment register
mov BX, 0000h   ;Set offset register            
add BX, CX
sub BX, 2            

mov AH, 0eh  

mov AL, 010 ;NL
int 10h
mov AL, 013 ;CR  
int 10h



revprinting:
mov AL, [BX]
int 10h    
sub BX, 1
sub CX, 1
cmp CX, 1
jg revprinting

ret
4

2 に答える 2

2

バイトがアルファベット (0..9またはその他の非文字) であることがわかっている場合は、IF 部分をスキップできます。

20hASCII で大文字と小文字の違いとして使用する代わりに、ビット番号を無条件に設定またはクリアします。5 (ASCII 文字: ビット番号 7、...、ビット番号 0)。

ASCII 文字のビット 5 を 1 に設定すると、小文字になります。ビット 5 を 0 に設定すると、大文字になります。( http://asciitable.com/ )

大文字を取得します。ビット 5 を 0にクリアするには、他のすべてのビットが設定されているマスクとの AND をとります。

and al, 0xdf   ; you may use 0dfH instead of 0xdf in your notation, or ~0x20

小文字を取得します。ビット 5 を 1 に設定します。

or al, 0x20    ; 20h

これは、文字が文字かどうかを確認するのにも役立ちます。すべての文字を大文字に設定するだけです。その後、文字が「A」の下にあるか「Z」の上にあるかを「cmp」で確認します。そうでないなら手紙です。またはさらに良いことに、

and   al, 0xdf      ; force uppercase (if it was a letter to start with)

sub   al, 'A'       ; letters turn into AL in [0..25]
cmp   al, 'Z'-'A'
ja   non_letter     ; unsigned compare: lower ASCII codes wrap to high values
于 2014-12-29T01:09:13.730 に答える
0

条件付きで変換を行うには、通常、いくつかの比較を使用します。

    cmp al, 'a'
    jl  not_lower
    cmp al 'z'
    jg  not_lower

    sub al, 20h

not_lower:

状況によっては、別の可能性があります。

    mov bl, al
    sub bl, 'a'
    cmp bl, 'z'-'a'   ; 25
    ja  not_lower

    sub al, 20h

not_lower:

jmp を 2 つではなく 1 つだけで済むようになり、予測しやすくなります。

于 2012-10-13T00:57:19.590 に答える