用DOS功能调用实现简单输入输出(汇编)

实验目的:掌握在PC机上利用DOS功能调用实现简单输入输出的方法。

实验内容:利用DOS功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:

  1. 如果输入的是字母(A~Z,不区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表

  2. 若输入的不是字母或数字,则在屏幕上输出字符“*”

  3. 每输入一个字符,即时转换并在屏幕上显示,需考虑显示结果的清晰美观

  4. 支持反复输入,直到按ESC键退出程序返回DOS命令行

  5. 程序结束时,在屏幕上显示本人的姓名全拼和学号

例:在键盘上输入“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写汇编,可以去官网下个语法高亮的插件。

转载于:https://my.oschina.net/locusxt/blog/206666

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值