基本上我想要做的事情(这是一个赋值)是让用户输入一个字符,然后显示它是大写/小写字母,0-9十进制,可打印符号还是一个控件键。
不幸的是,虽然文档给了我一个想法,摆弄控制逻辑(如果/其他,循环等)实际上知道命令让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
所以我在想,假设我能够接受ascii中的控制键。是一旦用户输入一个字符,我将其转换为十六进制或十进制,以较容易然后运行,如果其他情况,如果它在某些值之间是一个X,然后显示X,如果它在2个不同的值之间它是一个Y等等。
因为小于33的东西显然是控制键,我认为,(DEL是一个控制键吗?它的DEC 127),但是我认为任何小于48的符号都是符号,但它也必须超过32,或者我是否隐含地假设它是否大于32但小于48,假设符号?讨厌一切似乎都存在于ASCII图表的不同部分。
这是将ASCII转换为HEX的代码,我认为十进制可能更容易使用,但我不知道如何a)弄清楚即使我在某个地方的注册表中有ascii字符的二进制值b)将它转换为十进制,因为我有这个代码也可以使用它吗?
;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中的汇编编程指南”。
我的查询是,如果代码将其转换为十六进制,它是否实际上在内存中作为十六进制?或者它只是显示为十六进制的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
无论我输入什么,它都会跳到“退出”,每次评估为“大于”。
答案 0 :(得分: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