实验目的:掌握在PC机上利用DOS功能调用实现简单输入输出的方法。
实验内容:利用DOS功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:
-
如果输入的是字母(A~Z,不区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表
-
若输入的不是字母或数字,则在屏幕上输出字符“*”
-
每输入一个字符,即时转换并在屏幕上显示,需考虑显示结果的清晰美观
-
支持反复输入,直到按ESC键退出程序返回DOS命令行
-
程序结束时,在屏幕上显示本人的姓名全拼和学号
例:在键盘上输入“U2011/”,对应输出内容为“Uniform two zero one one *”
A | Alpha | N | November | 1 | one |
B | Bravo | O | Oscar | 2 | two |
C | Charlie | P | Papa | 3 | three |
D | Delta | Q | Quebec | 4 | four |
E | Echo | R | Romeo | 5 | five |
F | Foxtrot | S | Sierra | 6 | six |
G | Golf | T | Tango | 7 | seven |
H | Hotel | U | Uniform | 8 | eight |
I | India | V | Victor | 9 | nine |
J | Juliet | W | Whisky | 0 | zero |
K | Kilo | X | X-ray | | |
L | Lima | Y | Yankee | | |
M | Mike | Z | Zulu | | |
;Q2.ASM
;locusxt
;cnjs.zhuting[at]gmail.com
data segment
myname db 0dh, 0ah, 'NAME: locusxt', 0dh, 0ah, '$'
myid db 'ID: locusxt', 0dh, 0ah, '$'
a db 'Alpha', 20h, '$' ;以下是字母对应的单词
b db 'Bravo', 20h, '$'
c db 'Charlie', 20h, '$'
d db 'Delta', 20h, '$'
e db 'Echo', 20h, '$'
f db 'Foxtrot', 20h, '$'
g db 'Golf', 20h, '$'
h db 'Hotel', 20h, '$'
i db 'India', 20h, '$'
j db 'Juliet', 20h, '$'
k db 'Kilo', 20h, '$'
l db 'Lima', 20h, '$'
m db 'Mike', 20h, '$'
n db 'November', 20h, '$'
o db 'Oscar', 20h, '$'
p db 'Papa', 20h, '$'
q db 'Quebec', 20h, '$'
r db 'Romeo', 20h, '$'
s db 'Sierra', 20h, '$'
t db 'Tango', 20h, '$'
u db 'Uniform', 20h, '$'
v db 'Victor', 20h, '$'
w db 'Whisky', 20h, '$'
x db 'X-ray', 20h, '$'
y db 'Yankee', 20h, '$'
z db 'Zulu', 20h, '$'
zero db 'zero', 20h, '$' ;以下是数字对应的单词
one db 'one', 20h, '$'
two db 'two', 20h, '$'
three db 'three', 20h, '$'
four db 'four', 20h, '$'
five db 'five', 20h, '$'
six db 'six', 20h, '$'
seven db 'seven', 20h, '$'
eight db 'eight', 20h, '$'
nine db 'nine', 20h, '$'
star db '*', 20h, '$'
;以下是索引表
alphabet dw a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p ,q, r, s, t, u, v, w, x, y, z
num dw zero, one, two, three, four, five, six, seven, eight, nine
data ends
stack segment stack
sta db 50 dup(?)
top equ length sta
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov ax, top
mov sp, ax
;获取一个按键
getkey:
mov ah, 07h
int 21h
compare:
;判断是不是一个小写字母
cmp al, 'z'
jg dispstar
cmp al, 'a'
jnl dispalph
;判断是不是大写字母
cmp al, 'Z'
jg dispstar
cmp al, 'A'
jnl dispalphc
;判断是不是数字
cmp al, '9'
jg dispstar
cmp al, '0'
jnl dispnum
;判断是不是esc
cmp al, 1bh
jnz dispstar
jmp dealesc
dispalphc: ;大写字母先加0x20转成小写处理
add al, 20h
dispalph:
sub al, 'a'
mov ah, 00h
mov si, ax
sal si, 01h
mov bx, offset alphabet
mov dx, [bx + si]
mov ah, 09h
int 21h
jmp getkey
dispnum: ;显示一个数字对应的单词
sub al, '0'
mov ah, 00h
mov si, ax
sal si, 01h
mov bx, offset num
mov dx, [bx + si]
mov ah, 09h
int 21h
jmp getkey
dispstar: ;显示星号
mov dx, offset star
mov ah, 09h
int 21h
jmp getkey
dealesc: ;输入esc退出
mov dx, offset myname
mov ah, 09h
int 21h
mov dx, offset myid
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
code ends
end begin
汇编好麻烦。
dosbox好像不支持杀进程,dosbox有linux,mac版。
用masm汇编的时候,后面的文件得是*.asm,tab补全帮我补成*.exe了,调了半天死活一堆error
vim写汇编,可以去官网下个语法高亮的插件。