西电微机原理实验一(详细注释版)
环境:VSCode+MASM/TASM插件(建议使用相同环境,学校机房环境有点老,可能会出一些奇怪的问题)
实验室:EⅡ-522
实验要求
- 打印Hello World!
- 打印输入的姓名
- 打印输入的id
- 将输入的字符转换成ASCII码
- 输入q或Q退出程序
代码
stack segment
db 128 dup(0)
stack ends
data segment
msg1 db 'hello world!$' ; 定义一个字符串,表示“hello world!”
msg2 db 'please input your name:$' ; 定义一个字符串,表示提示输入名字
msg3 db 'please input your id:$' ; 定义一个字符串,表示提示输入ID
msg4 db 'please input a char:$' ; 定义一个字符串,表示提示输入一个字符
buffer db '$' ; 定义一个字符串,表示空字符串
data ends
code segment
assume cs:code,ds:data
start:
; 将数据段地址赋值给AX
mov ax,data
; 将AX的值赋值给DS
mov ds,ax
; 将AX的值赋值给ES
mov es,ax
; 显示“hello world!”字符串
lea dx, msg1
mov ah, 9
int 21h ;中断调用指令
; 回车换行
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
; 提示输入名字
lea dx, msg2
mov ah, 9
int 21h
; 输入名字
lea dx, buffer
mov ah, 0Ah
mov al, 00h
int 21h
; 清空缓冲区
xor bx,bx
mov bl,buffer[1]
mov buffer[bx+2],'$'
;换行
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h
;输出姓名
lea dx, offset [buffer+2]
mov ah, 09h
int 21h
;换行
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h
; 提示输入ID
lea dx, msg3
mov ah,9
int 21h
; 提示输入ID的后续操作
lea dx,buffer
mov ah,0Ah
mov al,00h
int 21h
;清空缓冲区
xor bx,bx
mov bl,buffer[1]
mov buffer[bx+2],'$'
;换行
mov dl,0Dh
mov ah,2
int 21h
mov dl,0Ah
mov ah,2
int 21h
; 显示ID
lea dx, offset [buffer+2]
mov ah, 09h
int 21h
cmpq:
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
; 显示提示输入字符的字符串
lea dx,msg4
mov ah,9
int 21h
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
;输入一个字符并回显
mov ah, 1
int 21h ;执行中断1
cmp al, 'q'
;若等于q,则跳转到ending
je ending
cmp al, 'Q'
;若等于Q,则跳转到ending
je ending
;低八位存入bl
mov bl, al
;高八位存入bh
mov bh, al
;回车+换行
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, bh
mov ah, 2
int 21h
mov dl, 9
mov ah, 2
and bl, 0F0h ;取bl高四位
mov cl, 4
;右移4位,高4位变为低4位
shr bl, cl
cmp bl, 9
ja alph1
;处理数字
numb1:
;转换为ascii码
add bl, '0'
mov dl, bl
mov ah, 2
int 21h ;执行2号中断,显示输出
jmp low4
alph1:
;转换为ascii码
add bl, 37h
mov dl, bl
mov ah, 2
int 21h
low4:
and bh, 0Fh ;取低四位
cmp bh, 9
ja alph2
numb2:
add bh, '0' ;加0
mov dl, bh
mov ah, 2
int 21h
jmp cmpq
alph2:
add bh, 37h ;加A
mov dl, bh
mov ah, 2
int 21h
jmp cmpq
ending:
;回车+换行
mov dl, 0Dh
mov ah, 2
int 21h
mov dl, 0Ah
mov ah, 2
int 21h
;终止程序
mov ax, 4c00h
int 21h
code ends
end start
运行结果
欢迎访问我的个人博客网站Levitate Gu