安工大汇编实验

汇编语言程序设计

姓 名

学 号 班 级 指导教师

实验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

运行结果:


相关文章

  • 哈工大 嵌入式系统实验指导02
  • 实验二:GPIO输入/输出实验 1.实验目的 z 了解Mini2440 ARM实验板的功能和使用. z 掌握J-link 仿真器的用法,并能连接实验板调试程序. z 掌握GPIO 外设的操作原理和编程. 2.实验设备 z 硬件:PC机一台 ...查看


  • 哈工大单片机实验报告
  • H a r b i n I n s t i t u t e o f T e c h n o l o g y 单片机原理与应用 实验报告 学生姓名 学班专 号 级 业 : : : : : : 电信学院 任课教师 所在单位 2014年4 月 软 ...查看


  • 哈工大单片机实验报告 1
  • Harbin Institute of Technology 单片机原理与应用 实验报告 学生姓名 学班专 号 级 业 : : : : : : 任课教师 所在单位 软件实验 在软件实验部分,通过实验程序的调试,使学生熟悉MCS-51的指令系 ...查看


  • 哈工大校情校史
  • 哈尔滨工业大学 哈尔滨工业大学是隶属于工业和信息化部的全国重点大学,创建于1920年.20世纪50年代,哈工大是中国政府确定的学习苏联先进教育制度的两所院校之一.1954年哈工大进入国家首批重点建设的6所高校行列,1984年再次被确定为国家 ...查看


  • 参观哈工大航天馆有感
  • 参观哈工大航天馆有感 今天由郭老师带领我们大骨班的学员到哈工大航天馆进行参观学习.在哈工大航天馆,你可以看到"长征"系列运载火箭.神舟五号载人飞船等实物与模型,还有部分航天器.导弹等实物„„100多见展品,每一件展品,都 ...查看


  • 武汉工程大学2010
  • 武汉工程大学2010-2011学年度人才招聘启事 一.中国科学院院士.中国工程院院士 每年全职在我校工作时间9个月以上.工作和生活待遇面商. 二.国家"千人计划"和湖北省"百人计划"特聘岗位人选 (一 ...查看


  • 哈工大数电自主设计报告
  • 姓名 班级 学号 实验日期 节次 教师签字 成绩 实验名称:基于555定时器设计的频率和脉宽可调的波形发生器 1. 实验目的 1) 进一步掌握555定时器的基本电路功能及使用方法: 2) 使用555定时器设计一个频率和脉宽可调的波形发生器: ...查看


  • 哈工大简介
  • 哈工大简介.txt举得起放得下叫举重,举得起放不下叫负重.头要有勇气,抬头要有底气.学习要加,骄傲要减,机会要乘,懒惰要除.人生三难题:思,相思,单相思. 哈尔滨工业大学隶属于工业和信息化部,是由工信部.教育部.黑龙江省共建的国家重点大学, ...查看


  • 哈工大实验报告电工模拟
  • 总成绩: 一.设计任务 设计一个方波-三角波发生器 二.设计条件 本设计基于学校实验室,所用元件如下: EEL-69模拟.数字电子技术实验箱 一台 集成运算放大器实验插板 一块 直流稳压电源 一台 双踪示波器 一台 数字万用表 一块 主要元 ...查看


热门内容