基本的に私がやりたいこと(これは割り当て用です)は、ユーザーに文字を入力させてから、大文字/小文字、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
何を入力しても、毎回「より大きい」と評価される「終了」にジャンプします。