汇编语言程序设计
实
验
报
告
姓 名
学 号 班 级 指导教师
实验1:汇编运行环境及方法、简单
程序设计
实验目的:
熟悉汇编语言运行环境和方法;
了解如何使用汇编语言编制程序;
熟悉debug 有关命令的使用方法;
利用debug 掌握有关指令的功能;
利用debug 运行简单的程序段。
实验内容:
比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘Match! ’,若不同则显示‘No match!’。
源程序:
DSEG SEGMENT
STRING1 DB 'move the cursor backward'
STRING2 DB 'move The cursor backward'
MESS1 DB 'Match!',0DH,0AH,'$'
MESS2 DB 'No match!',13,10,'$'
DSEG ENDS
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CSEG,DS:DSEG,ES:DSEG
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
LEA SI,STRING1
LEA DI,STRING2
CLD
MOV CX,24
REPZ CMPSB
JZ MATCH
LEA DX,MESS2
JMP SHORT DISP
MATCH:
LEA DX,MESS1
DISP:
MOV AH,9
INT 21H
RET
MAIN ENDP
CSEG ENDS
END START
运行结果:
实验总结:
上机实现一个简单汇编程序有如下几步:
a .首先在D 盘中将运行程序的几个程序放在同一个文件夹
b .用记事本编写程序
c .将编写的程序保存成ASM 格式文件
d .打开dox.box ,按照步骤将ASM 文件生成OBJ 文件再生成EXE 文件
e .最后运行EXE 程序得到结果
实验二 用DEBUG 编程:使用堆栈段将
AX 和BX 的内容进行交换等 实验目的:
掌握debug 运行的步骤;了解各指令的作用;
知道数据传送指令的相关内容。
实验内容:
堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX 和BX 的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG 调试程序进行汇编与调试。
源程序:
DA TAS SEGMENT
DA TAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,3000H
MOV BX,5000H
PUSH AX
MOV AX,BX
POP BX
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
实验三 存储器块清零和内存块移动
存储器块清零
实验目的:
掌握debug 运行的步骤;了解各指令的作用;
知道数据传送指令的相关内容。
实验内容:
第一个程序是存储块清零。程序流程为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设置块的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。
源程序:
存储器块清零源程序:
data segment
blockdb 256 dup(55h)
data ends
code segment
assumecs:code,ds:data
startproc near
movax,data
movds,ax
movbx,offset block
mov cx,256
again:
mov [bx],byte ptr 0
incbx
loop again
mov ax,4ch
int 21h
code ends
end start
运行结果:
内存块移动源程序:
DA TAS SEGMENT
SOURCE DB 256 DUP(055H)
TARGET DB 256 DUP(0AAH)
DA TAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET
MOV CX,256
REP MOVSB
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
执行过程:
第一个程序在进入debug 后,先用-u 指令查看一下程序,再将断点设置在指令Loop again之后,通过指令-g 加上指令Loop again 后的地址,将程序运行到Loop again 之后停止,然后再通过-d 指令查看相关内存内容是否被清零。第二个程序在进入到debug 后,先用-u 指令查看一下程序,再通过指令-t 运行后,然后用-d 指令查看一下内存块的相关内容。
实验四 将键盘输入的小写字母用大
写字母显示出来
实验目的:
掌握子程序的编写及调用,子程序的参数传递方法;
参数传递方法的掌握和运用。
实验内容:
从键盘输入一组字符,直到‘0‘为止。编一子程序,完成当输入是小写字母时,则修改成大写字母。输入的字符存放在STRING 为首址的存储单元中。 源程序:
DA TA SEGMENT
STRING DB 100 DUP(?)
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DI,OFFSET STRING
AGAIN:
MOV AH,1
INT 21H
CMP AL,'0'
JE EXIT
CALL STOB
MOV [DI],AL
INC DI
JMP AGAIN
EXIT:
MOV AH,4CH
INT 21H
STOB PROC NEAR
CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
SUB AL,20H
NEXT:
RET
STOB ENDP CODE ENDS END START
运行结果:
实验五 循环程序设计
实验目的:
掌握循环程序的设计方法;
进一步熟悉利用debug 程序修改参数的方法,并检查验证结果的正确性; 学会针对不同的问题,选用不同的组织循环的方法。
实验内容:
编写一个程序,显示AL 寄存器中的两位十六进制数。
源程序:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,3BH
MOV CX,2
LOOK:
PUSH CX
MOV CL,4
ROR AL,CL
PUSH AX
MOV DL,AL
AND DL,0FH
CMP DL,09
JBE NEXT1
ADD DL,07
NEXT1:
ADD DL,30H
MOV AH,2
INT 21H
POP AX
POP CX
LOOP LOOK
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
实验六 分支程序设计
实验目的:
掌握分支程序的设计方法;
掌握和利用debug 修改参数、检查结果的方法;
掌握汇编语言的编辑、汇编、连接及调试过程。
实验内容:
试编一程序,求三个带符号数据中的最大值,并将最大值存入MAX 字节单元中。 源程序:
DA TA SEGMENT
X DW -0ABH
Y DW 205
Z DW 200
MAX DW ?
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,X
CMP AX,Y
JGE L1
MOV AX,Y
L1:
CMP AX,Z
JGE EXIT
MOV AX,Z
EXIT:
MOV MAX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
实验七 统计不同成绩段学生的人数
实验目的:
综合的运用各个知识点解决一个实际问题;
加强对所学的知识的理解;
学会把掌握的知识运用的解决问题方面,培养独立思考的能力。 实验内容:
设有十个学生成绩分别是75,66,82,90,74,88,98,62,100,87分。编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并显示统计结果。用分支结构编写成绩段,统计所有成绩用循环结构完成。统计成绩和显示结果用子程序完成。 源程序:
data segment
credit dw 76,69,84,90,73,88,99,63,100,80
mes1db '60-69:$'
mes2db '70-79:$'
mes3db '80-89:$'
mes4db '90-99:$'
mes5db '100:$'
v1db ? ;60-69段人数计数器
v2db ? ;70-79段人数计数器
v3db ? ;80-89段人数计数器
v4db ? ;90-99段人数计数器
v5db ? ;100段人数计数器
data ends
code segment
assumecs:code,ds:data
mainproc far
start:
movax,data
movds,ax
call count ;统计各分段人数的子程序
mov ah,4ch
int 21h
ret
mainendp
countproc near
leasi,credit
mov cx,0ah
m1:movbx,[si]
add si,2
cmp bx,60
jl m6
cmp bx,69
jg m2
inc v1
jmp m6 ;60-69
m2:cmp bx,79
jg m3 ;70-79
inc v2
jmp m6
m3:cmp bx,89
jg m4 ;80-89
inc v3
jmp m6
m4:cmp bx,99
jg m5 ;90-99
inc v4
jmp m6
m5:cmp bx,100
jg m6 ;100
inc v5
m6:loop m1
movdx,offset mes1
mov ah,09h
int 21h
mov dl,v1
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes2
mov ah,09h
int 21h
mov dl,v2
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes3
mov ah,09h
int 21h
mov dl,v3
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes4
mov ah,09h
int 21h
mov dl,v4
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes5
mov ah,09h
int 21h
mov dl,v5
add dl,30h
mov ah,02h
int 21h
exit:
ret
countendp
crlfproc near ; 回车换行子程序mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlfendp
code ends
end start
运行结果:
汇编语言程序设计
实
验
报
告
姓 名
学 号 班 级 指导教师
实验1:汇编运行环境及方法、简单
程序设计
实验目的:
熟悉汇编语言运行环境和方法;
了解如何使用汇编语言编制程序;
熟悉debug 有关命令的使用方法;
利用debug 掌握有关指令的功能;
利用debug 运行简单的程序段。
实验内容:
比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘Match! ’,若不同则显示‘No match!’。
源程序:
DSEG SEGMENT
STRING1 DB 'move the cursor backward'
STRING2 DB 'move The cursor backward'
MESS1 DB 'Match!',0DH,0AH,'$'
MESS2 DB 'No match!',13,10,'$'
DSEG ENDS
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CSEG,DS:DSEG,ES:DSEG
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
LEA SI,STRING1
LEA DI,STRING2
CLD
MOV CX,24
REPZ CMPSB
JZ MATCH
LEA DX,MESS2
JMP SHORT DISP
MATCH:
LEA DX,MESS1
DISP:
MOV AH,9
INT 21H
RET
MAIN ENDP
CSEG ENDS
END START
运行结果:
实验总结:
上机实现一个简单汇编程序有如下几步:
a .首先在D 盘中将运行程序的几个程序放在同一个文件夹
b .用记事本编写程序
c .将编写的程序保存成ASM 格式文件
d .打开dox.box ,按照步骤将ASM 文件生成OBJ 文件再生成EXE 文件
e .最后运行EXE 程序得到结果
实验二 用DEBUG 编程:使用堆栈段将
AX 和BX 的内容进行交换等 实验目的:
掌握debug 运行的步骤;了解各指令的作用;
知道数据传送指令的相关内容。
实验内容:
堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX 和BX 的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG 调试程序进行汇编与调试。
源程序:
DA TAS SEGMENT
DA TAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,3000H
MOV BX,5000H
PUSH AX
MOV AX,BX
POP BX
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
实验三 存储器块清零和内存块移动
存储器块清零
实验目的:
掌握debug 运行的步骤;了解各指令的作用;
知道数据传送指令的相关内容。
实验内容:
第一个程序是存储块清零。程序流程为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设置块的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。
源程序:
存储器块清零源程序:
data segment
blockdb 256 dup(55h)
data ends
code segment
assumecs:code,ds:data
startproc near
movax,data
movds,ax
movbx,offset block
mov cx,256
again:
mov [bx],byte ptr 0
incbx
loop again
mov ax,4ch
int 21h
code ends
end start
运行结果:
内存块移动源程序:
DA TAS SEGMENT
SOURCE DB 256 DUP(055H)
TARGET DB 256 DUP(0AAH)
DA TAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET
MOV CX,256
REP MOVSB
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
执行过程:
第一个程序在进入debug 后,先用-u 指令查看一下程序,再将断点设置在指令Loop again之后,通过指令-g 加上指令Loop again 后的地址,将程序运行到Loop again 之后停止,然后再通过-d 指令查看相关内存内容是否被清零。第二个程序在进入到debug 后,先用-u 指令查看一下程序,再通过指令-t 运行后,然后用-d 指令查看一下内存块的相关内容。
实验四 将键盘输入的小写字母用大
写字母显示出来
实验目的:
掌握子程序的编写及调用,子程序的参数传递方法;
参数传递方法的掌握和运用。
实验内容:
从键盘输入一组字符,直到‘0‘为止。编一子程序,完成当输入是小写字母时,则修改成大写字母。输入的字符存放在STRING 为首址的存储单元中。 源程序:
DA TA SEGMENT
STRING DB 100 DUP(?)
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DI,OFFSET STRING
AGAIN:
MOV AH,1
INT 21H
CMP AL,'0'
JE EXIT
CALL STOB
MOV [DI],AL
INC DI
JMP AGAIN
EXIT:
MOV AH,4CH
INT 21H
STOB PROC NEAR
CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
SUB AL,20H
NEXT:
RET
STOB ENDP CODE ENDS END START
运行结果:
实验五 循环程序设计
实验目的:
掌握循环程序的设计方法;
进一步熟悉利用debug 程序修改参数的方法,并检查验证结果的正确性; 学会针对不同的问题,选用不同的组织循环的方法。
实验内容:
编写一个程序,显示AL 寄存器中的两位十六进制数。
源程序:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AL,3BH
MOV CX,2
LOOK:
PUSH CX
MOV CL,4
ROR AL,CL
PUSH AX
MOV DL,AL
AND DL,0FH
CMP DL,09
JBE NEXT1
ADD DL,07
NEXT1:
ADD DL,30H
MOV AH,2
INT 21H
POP AX
POP CX
LOOP LOOK
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
实验六 分支程序设计
实验目的:
掌握分支程序的设计方法;
掌握和利用debug 修改参数、检查结果的方法;
掌握汇编语言的编辑、汇编、连接及调试过程。
实验内容:
试编一程序,求三个带符号数据中的最大值,并将最大值存入MAX 字节单元中。 源程序:
DA TA SEGMENT
X DW -0ABH
Y DW 205
Z DW 200
MAX DW ?
DA TA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,X
CMP AX,Y
JGE L1
MOV AX,Y
L1:
CMP AX,Z
JGE EXIT
MOV AX,Z
EXIT:
MOV MAX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
实验七 统计不同成绩段学生的人数
实验目的:
综合的运用各个知识点解决一个实际问题;
加强对所学的知识的理解;
学会把掌握的知识运用的解决问题方面,培养独立思考的能力。 实验内容:
设有十个学生成绩分别是75,66,82,90,74,88,98,62,100,87分。编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并显示统计结果。用分支结构编写成绩段,统计所有成绩用循环结构完成。统计成绩和显示结果用子程序完成。 源程序:
data segment
credit dw 76,69,84,90,73,88,99,63,100,80
mes1db '60-69:$'
mes2db '70-79:$'
mes3db '80-89:$'
mes4db '90-99:$'
mes5db '100:$'
v1db ? ;60-69段人数计数器
v2db ? ;70-79段人数计数器
v3db ? ;80-89段人数计数器
v4db ? ;90-99段人数计数器
v5db ? ;100段人数计数器
data ends
code segment
assumecs:code,ds:data
mainproc far
start:
movax,data
movds,ax
call count ;统计各分段人数的子程序
mov ah,4ch
int 21h
ret
mainendp
countproc near
leasi,credit
mov cx,0ah
m1:movbx,[si]
add si,2
cmp bx,60
jl m6
cmp bx,69
jg m2
inc v1
jmp m6 ;60-69
m2:cmp bx,79
jg m3 ;70-79
inc v2
jmp m6
m3:cmp bx,89
jg m4 ;80-89
inc v3
jmp m6
m4:cmp bx,99
jg m5 ;90-99
inc v4
jmp m6
m5:cmp bx,100
jg m6 ;100
inc v5
m6:loop m1
movdx,offset mes1
mov ah,09h
int 21h
mov dl,v1
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes2
mov ah,09h
int 21h
mov dl,v2
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes3
mov ah,09h
int 21h
mov dl,v3
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes4
mov ah,09h
int 21h
mov dl,v4
add dl,30h
mov ah,02h
int 21h
callcrlf
movdx,offset mes5
mov ah,09h
int 21h
mov dl,v5
add dl,30h
mov ah,02h
int 21h
exit:
ret
countendp
crlfproc near ; 回车换行子程序mov dl,0ah
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
ret
crlfendp
code ends
end start
运行结果: