微机原理实验(含解答程序) 下载本文

微机原理实验课题

(共16个内容,附解答程序)

(汇编程序可以使用MASM FOR WINDOWS)

1.将偏移地址为2000h开始的100个单元依次设置为0~99。。 2.将两个64位的二进制数相加,记录相加的和以及各个状态标志的值。

3. 编写程序,在屏幕上分行显示自己的姓名、学号。

4. 编写程序,通过键盘输入0——9之间的一个数字,利用查表法计算其平方。在DEBUG下查看执行结果。

?1?5. 用分支结构设计程序实现符号函数y??0??1?x?0x?0x?0 ,要求x和y存放

在内存单元中,并将判断的结果在屏幕上显示输出。

6. 在键盘上输入一个字符,判断是否为小写字母,若不是,显示错误信息,若是,则将其转换为大写字母并显示。

7. 在键盘上输入一个字符,判断它是一个数字、大写字母还是小写字母,若为数字,则显示digital,若为字母,显示letter,否则,显示other。

8. 将字节型变量x的低四位(一位十六进制数)以十六进制数的形式显示。

9. 编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。

10. 将字形变量x以二进制数的形式在屏幕上显示输出。 11. 将字形变量x以十六进制数的形式在屏幕上显示输出。 12. 将内存单元缓冲区中的符号数(20个)按从小到大的顺序排列,并以十六进制数的形式显示。

13. 编制程序计算S=1+2+3+……+N,并将结果由屏幕上显示出来。(要求:在屏幕上显示提示信息,提示输入N,N用十六进制表示,且N小于0FH,用子程序实现(段内),将输入的结果用十六进制数输出显示,显示结果的程序用子程序是实现(段间))。

14.要求在键盘上输入一个小于四位的十进制数,将其转换为二进制数存放,并讲转换后的结果以十六进制数的形式在屏幕上显示出来。(注意:首先判断正负,正数直接转换,负数以补码的形式存放;要求显示输入数据的提示信息,用子程序实现(段内),显示转换后结果结果的功能用子程序实现(段间)

15. 设计一个密码验证程序,在数据段设定一个密码,程序执行时首先显示输入密码的提示信息,要求输入密码,将输入的密码同设定的密码进行比较,相同则显示欢迎信息,密码错误显示错误信息并要求重新输入,三次错误则显示非法用户信息并退出程序。可以定义宏实现多次需要的操作。

16. 对以上程序进行修改,对初始密码利用某种算法进行加密,在比较时利用同样的算法对输入密码进行转换后再进行比较,增加对密码的保护。

解答程序如下

1.将偏移地址为2000h开始的100个单元依次设置为0~99。。 STACKl SEGMENT STACK ;8088宏汇编程序 DW 64 DUP(?) ;定义堆栈段 STACKl ENDS CODE SEGMENT

ASSUME CS:CODE ;定义代码段

START: MOV DI,[2000H] ;程序开始设数据区首址 MOV CX,100 ;字节数送入cx中 MOV AL,0000

NEXT: MOV [DI],AL ;写入一字节 INC DI ;修改地址指针 INC BX ;修改数据 INC AL DEC CX JNZ NEXT HLT

CODE ENDS ;代码段结束 END START ;程序结束

2.将两个64位的二进制数相加,记录相加的和以及各个状态标志的值。

STACKl SEGMENT STACK DW 64 DUP (?)

STACKl ENDS DATA SEGMENT XL1 DW 50H XL2 DW 12H XH1 DW 30H XH2 DW 25H YL1 DW 32H YL2 DW 55H YH1 DW 74H YH2 DW 32H DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,XL1 ADD AX,YL1 MOV BP,AX MOV AX,XL2 ADD AX,YL2 MOV SI,AX MOV AX,XH1

ADD AX,YH2 MOV DI,AX MOV AX,XH2 ADD AX,YH2 MOV DX,AX CODE ENDS END START

3. 编写程序,在屏幕上分行显示自己的姓名、学号。 datas segment

nam db 'name hu li hu tu$' num db 'number 20121201$' datas ends stacks segment dw 100 dup(?) stacks ends codes segment

assume cs:codes,ds:datas,ss:stacks start:

mov ax,datas mov ds,ax mov dx,offset nam mov ah,9

int 21h mov dl,0ah mov ah,2 int 21h mov dl,0dh int 21h

mov dx,offset num mov ah,9 int 21h

code segment ends end start

4. 编写程序,通过键盘输入0——9之间的一个数字,利用查表法计算其平方。在DEBUG下查看执行结果。 data segment x dw ?

pf db 0,01,04,9,16,25,36,49,64,81 y dw ?

prom dw 'please input a number:$' data ends code segment

assume ds:data,ss:stack,cs:code start:mov ax,data

mov ds,ax mov ah,09h mov dx,offset prom int 21h mov ah,1 int 21h and al,0fh mov x,ax lea bx,pf mov ax,x xlat mov y,ax mov ah,4ch int 21h code ends end start

?1?5. 用分支结构设计程序实现符号函数y??0??1?x?0x?0x?0 ,要求x和y存放

在内存单元中,并将判断的结果在屏幕上显示输出。 DATAS SEGMENT x db -4

y db ?;此处输入数据段代码

da db 'y=1','$' den db 'y=0','$' xiao db 'y=-1','$' DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX mov al,x cmp al,0 JL next jg next1 mov y,0 lea dx,den mov ah,09h int 21h jmp next2 next1:mov y,1

lea dx,da mov ah,09h int 21h jmp next2 next:mov y,-1 lea dx,xiao mov ah,09h int 21h

next2:MOV AH,4CH INT 21H CODES ENDS END START

6. 在键盘上输入一个字符,判断是否为小写字母,若不是,显示错误信息,若是,则将其转换为大写字母并显示。 DATAS SEGMENT

y db 'error','$';此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

MOV AX,DATAS MOV DS,AX mov ah,1 int 21h cmp al,61h jge next1 jmp next4 next1:cmp al,7Ah jle next2 jmp next4 next2:sub al,20h next3:mov dl,al mov ah,2 int 21h jmp next5 next4:lea dx,y mov ah,09h int 21h next5:MOV AH,4CH INT 21H CODES ENDS

END START

7. 在键盘上输入一个字符,判断它是一个数字、大写字母还是小写字母,若为数字,则显示digital,若为字母,显示letter,否则,显示other。

DATAS SEGMENT shuzi db 'digital','$' zimu db 'letter','$'

qita db 'other','$';此处输入数据段代码 DATAS ENDS STACKS SEGMENT

string db ?;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX

mov ah,1 ;此处输入代码段代码 int 21h cmp al,30h jge next1 jmp next6

next1:cmp al,39h jle next2 cmp al,41h jge next3 jmp next6 next3:cmp al,5Ah jle next5 jmp next8 next8:cmp al,61h jle next6 jge next4 next5:lea dx,zimu mov ah,09h int 21h jmp next7 next4:cmp al,7Ah jle next5 jmp next6 next2:lea dx,shuzi mov ah,09h int 21h jmp next7

next6:lea dx,qita mov ah,09h int 21h next7:MOV AH,4CH INT 21H CODES ENDS END START

8. 将字节型变量x的低四位(一位十六进制数)以十六进制数的形式显示。 data segment x db 15 data ends code segment

assume cs:code,ds:data start:mov ax,data mov ds,ax mov al ,x and al,0fh cmp al,9 JBE next add al,7 next:add al,30h

mov ah,2 mov dl,al int 21h mov ah,4ch int 21h code ends end start

9. 编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。 DATAS SEGMENT

s dw ?;此处输入数据段代码 DATAS ENDS STACKS SEGMENT

dw 64 dup(?);此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX mov bx,0001h mov dl,02h

lop2:mov al,bl inc dl;加1

mul dl;无符号数乘法AX=oprd*al add bx,ax

cmp ax,00C8h;与200比较 jna lop2;不高于转移 mov s,bx mov ch,4 mov cl,4 lop1:rol bx,cl mov dl,bl and dl,0Fh cmp dl,09h

jbe next;低于等于转移 add dl,7 next:add dl,30h mov ah,2 int 21h dec ch

jnz lop1;非零转移 MOV AH,4CH INT 21H

CODES ENDS END START

10. 将字形变量x以二进制数的形式在屏幕上显示输出。 DATAS SEGMENT

x dw 1325h;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX mov bx,x mov cx,10h

lop1:rol bx,1 ;不带cf的循环左移 jc next;进位转移,即cf=1 mov dl,30h;将0送入dl jmp next2

next:mov dl,31h;将1送入dl next2:mov ah,2

int 21h

loop lop1;循环执行lop1 MOV AH,4CH INT 21H CODES ENDS END START

11. 将字形变量x以十六进制数的形式在屏幕上显示输出。 DATAS SEGMENT

x dw 211dh;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX mov bx,x mov ch,4 mov cl,4 lop1:rol bx,cl

mov dl,bl and dl,0Fh cmp dl,09h

jbe next;低于等于转移 add dl,7 next:add dl,30h mov ah,2 int 21h dec ch

jnz lop1;非零转移 MOV AH,4CH INT 21H CODES ENDS END START

12. 将内存单元缓冲区中的符号数(20个)按从小到大的顺序排列,并以十六进制数的形式显示。 DATAS SEGMENT mem db

02h,01h,03h,04h,05h,06h,08h,09h,11h,88h,82h,84h,83h,96h,75h,90h,99h,28h,67h,97h ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT

;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX lea di,mem mov bl,19 mov bp,80h next1:mov si,di mov cl,bl next2:mov al,[si] add si,1 cmp [si],bp jge next3 cmp al,[si] jg next5 jmp next4 next5:mov dx,[si] mov [si-1],dx mov [si],al

jmp next4 next3:cmp al,[si] jg next4 mov dx,[si] mov [si-1],dx mov [si],al next4:dec cl jnz next2 dec bl jnz next1 lea bx,mem mov cl,20 lop1:mov dl,[bx] cmp dl,09h jb next add dl,7 next:add dl,30h mov ah,2 int 21h inc bx jmp lop1 MOV AH,4CH

INT 21H CODES ENDS END START

13. 编制程序计算S=1+2+3+……+N,并将结果由屏幕上显示出来。(要求:在屏幕上显示提示信息,提示输入N,N用十六进制表示,且N小于0FH,用子程序实现(段内),将输入的结果用十六进制数输出显示,显示结果的程序用子程序是实现(段间))。 DATAS SEGMENT sum dw ?

string db 'please input a number:','$' n db ?

string1 db' s=','$';此处输入数据段代码 DATAS ENDS STACKS SEGMENT

dw 100 dup(?);此处输入堆栈段代码 STACKS ENDS CODES1 SEGMENT

ASSUME CS:CODES1,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX call shuru

mov n,al push cs call jieguo mov al,n cmp al,40h jb next1 sub al,07h next1:sub al,30h mov cl,al mov ax,0 mov si,1 lop1:add ax,si inc si dec cl jnz lop1 mov sum,ax lea dx,string1 mov ah,09h int 21h mov bx,0000 mov bx,sum mov ah,2

mov ch,4 mov cl,4 lop2:rol bx,cl mov dl,bl and dl,0fh cmp dl,09h jbe next add dl,7 next:add dl,30h int 21h dec ch jnz lop2 mov ah,4ch int 21h shuru proc near lea dx,string mov ah,09h int 21h mov ah,7 int 21h ret shuru endp

MOV AH,4CH INT 21H CODES1 ENDS codes2 segment

assume CS:CODES2,DS:DATAS,SS:STACKS

jieguo proc far cld mov al,n mov ch,2 mov cl,4 lop:rol al,cl mov dl,al dec ch jnz lop mov ah,2 int 21h ret jieguo endp codes2 ends END START

14.要求在键盘上输入一个小于四位的十进制数,将其转换为二进制数存放,并讲转换后的结果以十六进制数的形式在屏幕上显示出来。(注

意:首先判断正负,正数直接转换,负数以补码的形式存放;要求显示输入数据的提示信息,用子程序实现(段内),显示转换后结果结果的功能用子程序实现(段间) DATA SEGMENT

PROMPT DB 'INPUT HEXADECIMAL: $' HEX DB 5

NNN DB 0 ;实际输入的字符数 DB 5 DUP(?) BIN DW ?

ERR DB 0AH,0DH,'ERROR!I HAVE NO TIME TO PLAY WITH YOU ! $' DATA ENDS

STACK1 SEGMENT PARA STACK

DW 20H DUP(0)

STACK1 ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK1

START:MOV AX,DATA MOV DS,AX MOV AX,STACK1 MOV SS,AX LEA DX,PROMPT

MOV AH,09H INT 21H

LEA DX,HEX ;输入ASCII码 MOV AH,0AH INT 21H MOV BIN,0 LEA SI,HEX+2 MOV CH,NNN CONV:MOV BL,[SI] CMP BL,0DH

JZ END0 CMP BL,'0'

Jl ERROR CMP BL,'9'

JA ERROR BIN1:AND BL,0FH MOV BH,0 PUSH CX

MOV AX,BIN MOV CX,10 MUL CX

ADD AX,BX 回车即结束 ;小于'0'转移 ;大于'9'转移 ;转换二进制数 ;弄成16位数 ;原来的数字乘以10 ;加上新输入的

; MOV BIN,AX ;存结果 INC SI POP CX DEC CH JNZ CONV

DISP:MOV DL,13 ;显示回车 MOV AH,2 INT 21H

MOV DL,10 ;显示换行 MOV AH,2 INT 21H

MOV AX,BIN ;取来数字 MOV CX,16 ;显示16位数 DDDD:MOV DL,'0' ;先计划显示0 TEST AX,8000H ;测试最高位 JZ DDD1

INC DL ;非0就显示1 DDD1:PUSH AX MOV AH,2 INT 21H POP AX

SHL AX,1 ;左移

LOOP DDDD JMP END0 ERROR:LEA DX,ERR MOV AH,09H INT 21H END0:MOV AH,4CH INT 21H CODE ENDS END START

15. 设计一个密码验证程序,在数据段设定一个密码,程序执行时首先显示输入密码的提示信息,要求输入密码,将输入的密码同设定的密码进行比较,相同则显示欢迎信息,密码错误显示错误信息并要求重新输入,三次错误则显示非法用户信息并退出程序。可以定义宏实现多次需要的操作。 DATA SEGMENT

s1 db'please enter your password:','$' s2 db'password input error!','$'

s3 db'You are welcome, login successful!','$' s4 db'please enter again:','$' s5 db'fei fa yong hu!','$' n db 23 x db ?

m2 db 21 dup(?) m1 db'617931','0Dh','$' DATA ENDS STACKS SEGMENT

db 100 dup(?);此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATA,SS:STACKS START:

MOV AX,DATA MOV DS,AX MOV ES,AX mov ax,stacks mov ss,ax lea dx,s1 mov ah,09h int 21h mov cx,3 next:push cx lea dx,n mov ah,0Ah int 21h

lea si,m1 lea di,m2 mov cx,6 cld repe cmpsb jz lop mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,s2 mov ah,09h int 21h mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop cx

dec cx cmp cx,0 jz next1 lea dx,s4 mov ah,09h int 21h inc cx next2:loop next jmp next3 lop:mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,s3 mov ah,09h int 21h jmp next3 next1:lea dx,s5 mov ah,09h int 21h

next3:MOV AH,4CH INT 21H CODES ENDS END START

16. 对以上程序进行修改,对初始密码利用某种算法进行加密,在比较时利用同样的算法对输入密码进行转换后再进行比较,增加对密码的保护。 DATA SEGMENT

s1 db'please enter your password:','$' s2 db'password input error!','$'

s3 db'You are welcome, login successful!','$' s4 db'please enter again:','$' s5 db'fei fa yong hu!','$' n db 23 x db ?

m2 db 21 dup(?) m1 db'617931','0Dh','$' DATA ENDS STACKS SEGMENT

db 100 dup(?);此处输入堆栈段代码 STACKS ENDS CODES SEGMENT

ASSUME CS:CODES,DS:DATA,SS:STACKS START:

MOV AX,DATA MOV DS,AX MOV ES,AX mov ax,stacks mov ss,ax lea dx,s1 mov ah,09h int 21h mov cx,3 next:push cx lea dx,n mov ah,0Ah int 21h inc m1 inc m2 lea si,m1 lea di,m2 mov cx,6 cld repe cmpsb

jz lop mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,s2 mov ah,09h int 21h mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop cx dec cx cmp cx,0 jz next1 lea dx,s4 mov ah,09h

int 21h inc cx next2:loop next jmp next3 lop:mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,s3 mov ah,09h int 21h jmp next3 next1:lea dx,s5 mov ah,09h int 21h next3:MOV AH,4CH INT 21H CODES ENDS END START