3

基本的に私がやりたいこと(これは割り当て用です)は、ユーザーに文字を入力させてから、大文字/小文字、10進数の0〜9、印刷可能な記号、またはコントロールキーのいずれかを表示することです。

残念ながら、ドキュメントには制御ロジック(if / else、ループなど)をいじるアイデアがありますが、NASMに実行させたいコマンドを実際に知っていると、スライドやクラスノートとしてイライラします。ドキュメントは完全に建設的なものではありません。

私が信じているコントロールキーは、DEC 0から32までのesc、null、tabなどです。

以下の私のコードでは、ユーザーからの入力を受け入れますが、コントロールキーを受け入れるとは思わないので、どうすればそうすることができますか?

segment .data

    msg3 dw '10h'
segment .bss
;
aChar resb 2 ; reserve 10 bytes for aChar

segment .text
    global _start
_start:


    ; ### Code for simple Input ###
    mov eax, 3 ; select kernal call #3
    mov ebx, 0 ; default input device
    mov ecx, aChar ; pointer to aChar'
    int 0x80 ; invoke kernal call to read   


    ; ### Code to spit the input to the screen ###
    mov eax, 4 ; select kernal call #4
    mov ebx, 1      ; default output device
    mov ecx, aChar ; pointer to ID
    int 0x80 ; write id read

    ; termination code
exit: mov ax, 1 ; select system call #1 system exit
    mov bx, 0 ; 0 means normal
    int 0x80 ; invoke kernal call

それで、私がアスキーでコントロールキーを受け入れることができると仮定して、私が考えていること。ユーザーが文字を入力したら、16進数または10進数のどちらか簡単な方に変換してから実行します。それ以外の場合は、特定の値の間にXが表示され、Xが表示されます。2つの異なる値の間にYが表示されます。等々。

33未満のものは明らかにコントロールキーだと思いますが(DELはコントロールキーですか?そのDEC 127)、48未満のものはシンボルだと思いますが、32を超える必要があります。 32より大きく48未満の場合、シンボルを仮定しますか?すべてがASCIIチャートのさまざまな部分にどのように生息しているかがわずらわしい。

ASCIIをHEXに変換するためのコードは次のとおりです。10進数の方が扱いやすいと思いますが、a)レジストリにascii文字のバイナリ値がある場合でも、b)変換する方法がわかりません。 10進数に変換するので、このコードを使用しているので、これを使用することもできますか?

;Hex equivalent of characters              HEX2CHAR.ASM
;
;        Objective: To print the hex equivalent of
;                   ASCII character code. Demonstrates
;                   the use of xlat instruction.
;            Input: Requests a character from the user.
;           Output: Prints the ASCII code of the
;                   input character in hex.
%include "io.mac"

.DATA
char_prompt    db  "Please input a character: ",0
out_msg1       db  "The ASCII code of '",0
out_msg2       db  "' in hex is ",0
query_msg      db  "Do you want to quit (Y/N): ",0
; translation table: 4-bit binary to hex
hex_table      db  "0123456789ABCDEF"    

.CODE
     .STARTUP
read_char:
     PutStr  char_prompt  ; request a char. input
     GetCh   AL           ; read input character

     PutStr  out_msg1
     PutCh   AL
     PutStr  out_msg2
     mov     AH,AL        ; save input character in AH
     mov     EBX,hex_table; EBX = translation table
     shr     AL,4         ; move upper 4 bits to lower half
     xlatb                ; replace AL with hex digit
     PutCh   AL           ; write the first hex digit
     mov     AL,AH        ; restore input character to AL
     and     AL,0FH       ; mask off upper 4 bits
     xlatb
     PutCh   AL           ; write the second hex digit
     nwln
     PutStr  query_msg    ; query user whether to terminate
     GetCh   AL           ; read response

     cmp     AL,'Y'       ; if response is not 'Y'
     jne     read_char    ; read another character
done:                        ; otherwise, terminate program
     .EXIT

「Linuxでのアセンブリプログラミングガイド」から。

私のクエリは、コードがそれを16進数に変換する場合、実際にはメモリ内のどこかに16進数として含まれていますか?それとも、16進数のASCII文字表現として表示されるだけですか?もしそうなら、それは明らかに私を助けません。

だから私の質問は順番にあります:

1.コントロールキーのユーザー入力を受け入れるにはどうすればよいですか。2. asciiを解析して、入力したASCII文字のHEX値を「可変」と言うための空想的な方法であると思われるメモリレジスタをどこかに置くにはどうすればよいですか。次に、表示する必要があるものを表示するために、どれをいじって評価することができますか?

編集:私は解決策を見つけたと思います、問題はそれが機能しないことであり、私は理由がわかりません:

decimal: 
    mov ebx, 30h    ; smallest decimal ASCII 
    mov edx, key
    cmp edx, ebx
    jl  uppercase
    mov ebx, 39h    ; test against 9
    cmp edx, ebx
    jg  exit
    mov eax, 4
    mov ebx, 1
    mov ecx, decimalKey
    mov edx, decimalLen
    int 0x80

何を入力しても、毎回「より大きい」と評価される「終了」にジャンプします。

4

1 に答える 1

2

やっと思いついた。

;
; This is assignment 2, it takes key strokes from the user
; and displays whether it is a control key, upper case,
; lower case, a printable symbol, or a decimal.
; By Blayne Elison Bradley, 9688994
; March 4th 2013

segment .data
    msg db 'Enter a character: ', 0xA ; text message
    len equ $-msg                                                           ; length of msg
    msg2 db 'Your character is: ' ; text message
    len2 equ $-msg2   

    controlKey: db "Control Key", 10
    controlLen: equ $-controlKey

    control2Key: db "ControlKey2", 10
    control2Len: equ $-control2Key

    printableKey: db "Printable", 10
    printableLen: equ $-printableKey

    printable2Key: db "Printable-2", 10
    printable2Len: equ $-printable2Key

    printable3Key: db "Printable-3", 10
    printable3Len: equ $-printable3Key

    printable4Key: db "Printable-4", 10
    printable4Len: equ $-printable4Key

    decimalKey: db "Decimal", 10
    decimalLen: equ $-decimalKey

    upperKey: db "Upper Case", 10
    upperLen: equ $-upperKey

    lowerKey: db "Lower Case", 10
    lowerLen: equ $-lowerKey

    smallerKey: db "Smaller", 10
    smallerLen: equ $-smallerKey

    biggerKey: db "Bigger", 10
    biggerLen: equ $-biggerKey

segment .bss
;
aChar resb 8 ; reserve 8 bytes for aChar
; I changed the above to 8 and that seems to work with the code below, 
; I don't know if its crucial to its execution. 

segment .text
        global _start
_start:

    ; ### Code for Outputting a simple Message ###
    mov eax, 4 ; select kernal call #4
    mov ebx, 1 ; default output device
    mov ecx, msg ; second argument; pointer to message
    mov edx, len ; third argument: length
    int 0x80 ; invoke kernal call to write

    mov eax, 3 ; select kernal call #3
    mov ebx, 0 ; default input device
    mov ecx, aChar ; pointer to aChar'
    int 0x80 ; invoke kernal call to read

control: ; is it a control key?
    mov al,  [aChar] ; 
    cmp al, 1Fh
    jg  printable

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, controlKey
    mov edx, controlLen
    int 0x80
    jmp exit ; because duh

decimal:    
    mov al,  [aChar] ; 
    cmp al, '9'
    jg  printable2

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, decimalKey
    mov edx, decimalLen
    int 0x80    
    jmp exit

printable:
    mov al,  [aChar] ; 
    cmp al, '/'
    jg  decimal

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, controlKey
    mov edx, controlLen
    int 0x80
    jmp exit ; because duh

printable2:
    mov al,  [aChar] ; 
    cmp al, '@'
    jg  uppercase

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, printable2Key
    mov edx, printable2Len
    int 0x80
    jmp exit ; because duh

uppercase:  
    mov al,  [aChar] ; 
    cmp al, 'Z'
    jg printable3

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, upperKey
    mov edx, upperLen
    int 0x80
    jmp exit ; because duh

printable3:
    mov al,  [aChar] ; 
    cmp al, '`'
    jg  lowercase

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, printable3Key
    mov edx, printable3Len
    int 0x80
    jmp exit ; because duh

lowercase:
    mov al,  [aChar] ; 
    cmp al, 7Ah
    jg  printable4

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, lowerKey
    mov edx, lowerLen
    int 0x80
    jmp exit ; because duh

printable4:
    mov al,  [aChar] ; 
    cmp al, '~'
    jg  control2

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, printable4Key
    mov edx, printable4Len
    int 0x80
    jmp exit ; because duh

control2: ; is it a control key?
    mov al,  [aChar] ; 
    cmp al, 7Fh
    jg  exit ; beyond range

    ; Output
    mov eax, 4
    mov ebx, 1
    mov ecx, control2Key
    mov edx, control2Len
    int 0x80
    jmp exit ; because duh

exit:
    mov eax, 1
    xor ebx, ebx
    int 0x80
于 2013-03-04T23:33:37.770 に答える