0

空白文字が入力されると、入力を印刷するのに少し苦労します。これまでのところ、入力の大文字/小文字を表示する必要がありますが、文字列を入力すると、空白文字の後の内容が読み取られません。助言がありますか?

編集: Intel x86 プロセッサと EMU8086 を使用した im

org 100h

include 'emu8086.inc'
printn "Enter string to convert" 
mov dx,20
call get_string

printn
mov bx,di
mov ah,0eh

mov al,[ds+bx]
cmp al, 41h

cmp al, 5Ah
jle ToLower1
cmp al, 61h
cmp al, 7ah
jle ToUpper1

ToLower1:
add al, 20h
int 10h
jmp stop1
ToUpper1:
sub al, 20h
int 10h
stop1:

inc bx
mov al,[ds+bx]
cmp al, 41h

cmp al, 5Ah
jle ToLower2
cmp al, 61h

cmp al, 7ah
jle ToUpper2

ToLower2:
add al, 20h
int 10h
jmp stop2
ToUpper2:
sub al, 20h
int 10h
stop2:

inc bx
mov al,[ds+bx]
cmp al, 41h

cmp al, 5Ah
jle ToLower3
cmp al, 61h

cmp al, 7ah
jle ToUpper3

ToLower3:
add al, 20h
int 10h
jmp stop3
ToUpper3:
sub al, 20h
int 10h
stop3:

inc bx
mov al,[ds+bx]
cmp al, 41h

cmp al, 5Ah
jle ToLower4
cmp al, 61h

cmp al, 7ah
jle ToUpper4

ToLower4:
add al, 20h
int 10h
jmp stop4
ToUpper4:
sub al, 20h
int 10h
stop4:

inc bx
mov al,[ds+bx]
cmp al, 41h

cmp al, 5Ah
jle ToLower5
cmp al, 61h
cmp al, 7ah
jle ToUpper5

ToLower5:
add al, 20h
int 10h
jmp stop5
ToUpper5:
sub al, 20h
int 10h
stop5:



printn
hlt
define_get_string
define_print_string
end
4

1 に答える 1

1

@Oded、これらのレジスタは x86 であり、emu8086 は 8086 CPU のエミュレータを意味します。

@OP: では、文字コードに 32 を追加して右下にするのですか? の ASCII コードspaceは 32 で、@シンボルの ASCII コードは 64 ですよね?これは、比較がどこかで間違っていることを示しているはずです。

cmp al, 41h ;A
; WHAT ARE YOU MISSING HERE?
cmp al, 5Ah ;Z
jle ToLower1

cmp al, 61h ;a
; WHAT ARE YOU MISSING HERE?
cmp al, 7ah ;z
jle ToUpper1

エラーが表示されますか? これは基本的に、現在の文字が以下に等しいかそれよりもZ低くするかどうかを CPU に伝えています。また、文字が z 以下の場合は大文字にします。

だからあなたが持っているものは次のとおりです:

cmp al, 41H後に条件付きジャンプと後に条件付きジャンプが必要ですcmp al, 61H

しかし、それでもうまくいきません。これはうまくいくはずです:

cmp     al, 41H
jb      CheckForLower
cmp     al, 5AH
ja     CheckForLower
; convert to lowercase here
; Process next char

cmp     al, 61H
jb      NotValid
cmp     al, 7AH
ja      NotValid
; convert to uppercase here
; Process next char

* 編集 * すべてのコードを 1 つのループにまとめることができます。

org 100h

include 'emu8086.inc'
printn "Enter string to convert" 
    mov     dx,20
    call    get_string

printn
    mov     bx, di
    mov     ah,0eh 

    jmp     Start  

NextChar:
    inc     bx 

Start:
    mov     al, [ds+bx]   
    test    al, al
    jz      stop5      

    cmp     al, 20H    
    je      PrintChar   

    cmp     al, 41H    
    jb      CheckLower  
    cmp     al, 5AH
    ja      CheckLower
    add     al, 20H   
    int     10H
    jmp     NextChar

CheckLower:
    cmp     al, 61H
    jb      NextChar
    cmp     al, 7AH
    ja      NextChar
    sub     al, 20H           

PrintChar:
    int     10H
    jmp     NextChar 

stop5:
    printn  
    hlt
    define_get_string
    define_print_string
end
于 2012-12-02T22:02:34.737 に答える