一、实验内容
1.在屏幕上显示一个字符的源程序:
DATAS SEGMENT STRING DB
\'HELLO!\',\'$\'
ORG
100H DATAS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS START:
MOV AX,DATAS
MOV DS,AX
LEA DX,STRING
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H CODES ENDS
END START
2.编写一个程序,实现字符串的复制功能,并且将复制的字符串显示出来
DATAS SEGMENT
STRING_A DB
\'ICH LIEBE DICH\',\'$\'
COUNT EQU $-OFFSET STRING_A DATAS ENDS
STACKS SEGMENT STRING_B DB COUNT DUP(?) STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV ES,AX
LEA SI,STRING_A
LEA DI,STRING_B
MOV CX,COUNT
STD
REP MOVSB
LEA DX,STRING_B
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
MOV AH,4CH
INT 21H CODES ENDS END START
3、利用中断调用,在屏幕上显示1—9 之间随机数。中断号86H
DATAS SEGMENT
CLA DB 13,10,\'WE ARE GOING TO PRODUCE A NUMBER AT RANDOM:$:\'
INFON DB 0DH,0AH,\'THE PROGRAM RUNS GOOD$\'
DATAS ENDS
STACKS SEGMENT STACK
DB 200 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME DS:DATAS,SS:STACKS,CS:CODES
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,CLA
MOV AH,9
INT 21H
MOV AX,0
MOV ES,AX;
MOV BX,86H*4
CLI
MOV WORD PTR ES:[BX],OFFSET RAN
MOV WORD PTR ES:[BX+2],SEG RAN
STI
INT 86H
MOV AH,02H
INT 21H
LEA DX,INFON
MOV AH,9
INT 21H
MOV AX,4C00H
INT 21H
RAN PROC
PUSH CX
PUSH DX
MOV AH,0
INT 1AH
MOV AX,DX
XOR DX,DX
MOV BX,10
DIV BX
ADD DL,30H
MOV AH,02H
INT 21H
POP DX
POP CX
IRET
RAN ENDP CODES ENDS END START
4.复制字符串,并倒序输出
DATAS SEGMENT
STRING_A DB \'still here\',13,10,\'$\'
STRING_L DB \'$\' DATAS ENDS
STACKS SEGMENT
STRING_B DB 100 DUP(?) STACKS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX
MOV AX,STACKS MOV SS,AX
LEA SI,STRING_L MOV AX,SI LEA SI,STRING_A
LEA DI,STRING_B SUB AX,SI SUB AX,3
MOV CX,AX MOV BX,AX
STD
REP MOVSB
LEA DX,STRING_B
MOV AH,9
INT 21H MOV DL,13 MOV AH,2 INT 21H MOV DL,10 MOV AH,2 INT 21H
LEA SI,STRING_B MOV CX,BX ADD SI,BX DEC SI S: MOV DL,[SI] MOV AH,2
INT 21H DEC SI
LOOP S
MOV AH,004CH
INT 21H CODES ENDS END START
5、显示比较两个数的大小
DATA SEGMENT A DB
33H B DB
87H DATA ENDS STACK SEGMENT
DW
128 DUP(?) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA MOV DS,AX MOV AL,\'A\' CMP B,AL JA BGA MOV DL,\'A\' MOV BL,\'B\' JMP DISP BGA: MOV DL,\'B\'
MOV BL,\'A\' DISP:
MOV AH,2 INT 21H MOV DL,\'>\' INT 21H MOV DL,BL INT 21H MOV AH,4CH INT 21H CODE ENDS END START
6、键盘输入10个学生的成绩,编写一个程序统计60-69分,70-79分,80-89分,90-99分及100分的人数,分别存放在Score6,Score7,Score8,Score9和Score10单元中。 输入10个学生的成绩如下:65 94 78 82 83 95 72 68 90 98 DATAS SEGMENT
INFON1 DB 13,10,\'PLEASE INPUT THOSE SCORDS(YOU NEED NOT PRESS ENTER BETWEEN THEM):$\'
INFON3 DB 13,10,\'$\'
INFON2 DB 13,10,\'THE NUMBER OF SCORD6-SCORD10 IS:\'
SCORD6 DB 30H
DB 32
SCORD7 DB 30H
DB 32
SCORD8 DB 30H
DB 32
SCORD9 DB 30H
DB 32
SCORD10 DB 30H
DB \'$\' DATAS ENDS
STACKS SEGMENT
DB 200 DUP(0) STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS
MOV DS,AX
MOV AH,9
LEA DX,INFON1
INT 21H
MOV AH,9
LEA DX,INFON3
INT 21H
MOV CX,10
S: MOV AH,1
INT 21H
CALL CAL
INT 21H
MOV AH,2
MOV DL,
32INT 21H
LOOP S
MOV AH,9
LEA DX,INFON2
INT 21H
MOV AX,4C00H
INT 21H
CAL PROC
PUSH AX
CMP AL,36H
JZ G6
CMP AL,37H
JZ G7
CMP AL,38H
JZ G8
CMP AL,39H
JZ G9
CMP AL,31H
JZ G1 G6:
ADD [SCORD6],1
JMP WAN G7:
ADD [SCORD7],1
JMP WAN G8:
ADD [SCORD8],1
JMP WAN G9:
ADD [SCORD9],1
JMP WAN G1: ADD [SCORD10],1
MOV AH,1
INT 21H WAN: POP AX RET CAL ENDP CODES ENDS END START
二、心得体会
指令助记符决定了指令的功能,对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有一个或多个操作数,大多数指令要显示写出来,还有些操作数是隐含的。当指令包含操作数的时候,书写时必须遵守:
1、指令助记符和操作数之间有分隔符,比如几个空格;
2、如果含有多个操作数,操作数之间用逗号分隔。
现在简单总结汇编语言指令的分类:
1、数据传送指令;
2、标志位操作指令;3 、算术运算指令;
4、逻辑运算指令;
5、移位运算指令;
6、位操作指令;
7、比较运算指令;
8、循环指令;
9、转移指令;
10、条件设置字节指令;
11、串操作指令;
12、BCD码运算调整指令;
13、处理器指令。
在编写汇编程序时,应该注意特别容易出现的错误,例如在编写数据传送指令时,目的操作数和源操作数的类型一定要匹配,CS不能作为目的操作数,offset后只能跟简单地址符号,等等。
汇编语言的寻址方式有直接寻址,寄存器寻址,基址变址寻址,相对基址变址寻址等等,掌握这些都是编写汇编程序很重要的环节。
汇编语言中的程序结构,子程序等知识也会帮助我们编写出一个更加完善的汇编程序。另外,我们还应该掌握DOS系统功能调用,宏汇编等知识。这里要对子程序和宏汇编加以区分,我的理解是:子程序是调用,而宏是替换
四周的学习很短,但是也很充实,有电磁场有信号有高频,但是天天抱着电脑写的是汇编,看的书也是汇编语言,其实很幸运能有机会学一些底层的东西,老师的教学很细致认真,没有老师的督促,学习的效果肯定不尽人意。