循环结构程序设计(汇编语言)
- 格式:doc
- 大小:97.00 KB
- 文档页数:11
汇编语言程序设计实验报告二(分支循环程序实验)一、实验目的1、掌握分支程序、循环程序的设计方法。
2、熟悉DEBUG程序的使用方法。
3、掌握汇编语言程序的编辑、汇编、连接以及调试过程。
二、实验内容1、编写一程序,将内存中某一区域的数据传送到另一个区域中(要求用循结构,不考虑数据块重叠问题)。
2、编写一程序,将内存中某一区域的数据传送到另一区域(要求考虑数据块重叠问题)。
三、实验准备1、预习数据传送指令,熟悉分支和循环程序设计方法。
2、预习DEBUG调试程序的使用方法。
3、根据实验内容要求,编写好实验源程序。
四、实验步骤1、用QE或其它编辑软件,在计算机上编辑源程序,使其正确无误。
2、汇编、连接源程序,产生.EXE可执行文件。
3、运行程序。
(1) 进入DEBUG。
打入DEBUGT MYPROG.EXE。
MYPROG为所编程序的文件名。
(2) 先用G命令连续剧连续执行程序,程序执行完毕后,观察运行结果。
如果执行后是对的,说明程序编写是正确的,如果结果不对,说明程序有错误,则执行下一步。
(3) 检查程序。
在程序中设置若干断点,以便杳出错误所在。
(4) 采用单步命令T或执行程序,观察各寄存器和存储单元内容,以便找到错误之处。
五、实验报告要求1、列出程序清单,并给出程序流程图。
2、总结实现数据传送的几种方法,指出它们的区别。
开始3、分析实验中所遇到的一些问题,分析错误原因。
4、说明本实验中是如何使用DEBUG进行调试的。
CX、SI、DI置初值六、流程图勤开始设置增量方式CX、SI、DI置初值保存SI内容AL [SI] SI SI+源块长度[DI] AL N SI>DIYSI SI+1 恢复SI内容恢复SI内容DI DI+1CX CX-1 设置减量方式N CX=0, SI指向源块末尾DI指向目的块末尾Y结束 [DI] [SI]题一流程图 N 传完了吗, 书馆 Y结束题二流程图七、程序清单题一程序清单:STACK SEGMENT STACK ‘STACK’DB 100 DUP(0)STACK ENDSDATA SEGMENT PARA ‘DATA’SOUR DB 0、1、2、3、4、5、6、7、8、9 DEST DB 10 DUP(,)DB ‘$’DATA ENDSSEGMENT PARA‘CODE’ASSUME CS:CODEMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,10MOV SI,offset SOURMOV DI, offset DESTAGAIN: MOV AL,[SI]MOV [DI],ALINC SIIN DILOOP AGAINMOV DX,offset DESTMOV AH,09HINT 21HRETMAIN ENDPCODE ENDSEND START题二程序清单:DATA SEGMENT PARA ‘DATA’STRG DB ‘ABCDEFGHIJKLMNOP’STG1 EQU STRG+4STG2 EQU STHG+8STRSE EQU 6DATA ENDSSTACK SEGMENT PARA ‘CODE’DB 100 DUP(0) STACK ENDSCODE SEGMENT PARA ‘CODE’ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIADD SI,STRSE-1CMP SI,DIPOP SIJL MOVESTDADD SI,STRSE-1ADD DI,STRSE-1 MOVE: REP MOVSB RETMAIN ENDPCODE ENDSEND START。
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
实验4 汇编语言循环结构程序设计实验题目:实现表达式S=(X+4×Y)/Z,其中X为有符号的字节数据,Z、Y为有符号的字数据,结果进行显示(进制不限)。
实验目的:1. 掌握循环结构程序设计:循环初始化、循环体、循环参数修改和循环控制;2. 灵活运用跳转类或循环指令;4. 掌握MASM、LINK、DEBUG等工具的使用。
实验设备:硬件:PC机软件:DOS操作系统、编辑软件、MASM 5.0实验内容:1. 程序代码DATA SEGMENTX DB 8Y DW 2Z DW 2N DW 10RESULT DW 4 DUP(?) ;定义RESULT单元,预留空间DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AL,XMOV AH,0H ;扩展xMOV BX,AXMOV CX,4MOV AX,YMUL CXADD AX,BXDIV ZDIV N ;除以10,用于进位显示MOV RESULT,AX ;存储商MOV RESULT+1,DX ;存储余数ADD RESULT,30HMOV DX,RESULTMOV AH,02HINT 21HADD RESULT+1,30HMOV DX,RESULT+1MOV AH,02HINT 21HMOV AH,4CH ;返回DOSINT 21HCODE ENDSEND START2.调试过程(具体应用DEBUG指令及其结果)实验思考与总结:通过本次实验我熟悉了源程序的基本组成及其使用,掌握了数据传送、算术运算类指令的使用。
汇编语言程序设计实例汇编语言是一种非常底层的编程语言,它允许程序员直接与计算机硬件进行交互。
汇编语言程序设计通常用于需要高性能或者对硬件有特定需求的场合。
以下是一些汇编语言程序设计的实例,以帮助理解其基本结构和应用。
实例一:数据传输在汇编语言中,数据传输是最基本的操作之一。
以下是一个简单的数据传输程序实例,它将一个立即数(即直接给出的数值)移动到寄存器中:```assemblymov ax, 1234h ; 将十六进制数1234h移动到ax寄存器```实例二:算术运算汇编语言支持基本的算术运算,如加法、减法、乘法和除法。
以下是一个进行加法运算的例子:```assemblymov ax, 5 ; 将数值5移动到ax寄存器add ax, 3 ; 将数值3加到ax寄存器中```实例三:条件跳转条件跳转是控制程序流程的重要手段。
以下是一个基于条件跳转的简单程序,它检查ax寄存器的值是否为0,并根据结果跳转到不同的代码段:```assemblymov ax, 0 ; 将数值0移动到ax寄存器jz zero ; 如果ax为0,则跳转到标签zero; 继续执行其他代码...zero:; 如果ax为0,执行这里的代码```实例四:循环结构循环结构在汇编语言中实现起来较为复杂,但可以通过重复使用跳转指令来模拟。
以下是一个简单的循环结构实例,它将ax寄存器的值减1,直到值为0:```assemblystart_loop:dec ax ; 将ax寄存器的值减1jnz start_loop ; 如果ax不为0,跳回start_loop```实例五:字符串处理汇编语言程序设计中,字符串处理是一个常见的任务。
以下是一个将字符串从源地址复制到目标地址的程序:```assemblymov si, source ; 将源字符串的地址移动到si寄存器mov di, dest ; 将目标地址移动到di寄存器mov cx, length ; 将字符串的长度移动到cx寄存器copy_loop:movsb ; 从si复制一个字节到diloop copy_loop ; 减少cx的值并重复循环直到cx为0```实例六:子程序调用在汇编语言中,子程序是一种将代码封装成模块化单元的方法。
c51汇编语言循环指令汇编语言循环指令loop在C51汇编语言中,循环指令(loop)是一种非常重要的控制流程语句,它允许程序反复执行一段指定的代码块,直到满足特定条件后才跳出循环。
本文将介绍C51汇编语言中的循环指令loop的使用方法和注意事项。
一、循环指令loop的基本语法及功能在C51汇编语言中,循环指令loop的基本语法如下:```loop: ;循环标签;循环体代码;循环控制代码sjmp loop ;无条件跳转到循环标签loop处```循环指令loop的功能主要分为两个部分,即执行循环体代码和控制循环的循环控制代码。
循环指令的循环标签用于标识循环的起点,在指令执行过程中,循环体代码将会被反复执行,直到循环控制代码指定的条件满足后才跳出循环。
二、循环指令loop的应用场景循环指令loop在C51汇编语言中具有广泛的应用场景,下面将列举其中的几种常见情况。
1. 循环计数当需要重复执行一段代码,且重复次数已知或可确定时,循环指令loop可以用于循环计数。
通过在循环控制代码中对计数器进行递减或递增操作,并在特定的计数值达到时跳出循环,从而实现循环计数的功能。
```MOV R1, #10 ;设置循环计数器初值为10loop:;循环体代码...DJNZ R1, loop ;循环计数器递减,若不为0则跳转至循环标签loop```上述代码示例中,循环计数器R1的初值被设置为10,当循环体代码执行完毕后,通过DJNZ指令递减循环计数器R1的值,若其不为0,则跳转至循环标签loop处,继续执行循环体代码,直到循环计数器的值递减至0。
2. 条件判断循环指令loop还可以用于条件判断,当满足特定条件时继续循环执行,不满足条件时跳出循环。
条件判断可以通过寄存器或内存中的值进行,根据不同的条件设置控制循环的条件语句。
```loop:;循环体代码...JNZ loop ;若条件满足,则跳转至循环标签loop处```上述代码示例中,JNZ指令用于判断特定条件是否满足,若满足则跳转至循环标签loop处,继续执行循环体代码,否则跳出循环。
循环结构程序设计(汇编语言)
汇编语言实验报告
实验名称:循环结构程序设计
姓名:
学号:
班级:
一、实验内容
1. 用多种循环方法实现1+2+3+…+20的程序(至少二种方法);
2. 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z 或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入;(选做)
3、编写一个汇编语言程序,要求将BX寄存器内的小写字母用大写字母显示出来。
4、ADDR单元是存放数据的内存单元,要求将该内存单元中的字依次用十六进制数显示出来。
二、实验目的
1. 掌握循环程序的结构。
2. 掌握循环程序的设计、编写及调试方法。
3. 掌握循环程序设计的基本方法。
主要掌握几种基本的循环程序设计技巧,如计数法程序设计、当循环、直到循环等程序设计技术。
三、实验结果
1、将内存中的数据块中(BUFF为起始地址)奇数和偶数分别存入以ADDR1和ADDR2开始的存储块中,并分别统计其中的奇、偶数,将统计结果存放在RESULT 开始的两个字存储单元中。
实验代码:(1.ASM 1.OBJ 1.EXE)
data segment
buff dw 6,35,99,17,80,69,50,33
addr1 dw 8 dup(?)
addr2 dw 8 dup(?)
result dw 0,0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,8d
mov si,0
mov di,0
mov bx,0
mov dx,0
L1:
test buff[si],0001h
je L2
mov ax,buff[si]
mov addr2[bx],ax
add si,2
add bx,2
inc dl
dec cx
jmp L1
L2:
mov ax,buff[si]
mov addr1[di],ax
add di,2
add si,2
inc dh
dec cx
jmp L1
mov si,0
mov byte ptr result[si],dh
add si,2
mov byte ptr result[si],dl code ends
end start
运行结果如下:
2、不利用乘法指令实现乘法的程序
代码如下:(2.ASM 2.OBJ 2.EXE) data segment
x dw 30d
y dw 10d
data ends
code segment
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov cx,x
mov bx,y
mov ax,0
L1:
add ax,bx
loop L1
mov dx,ax
mov ah,2
int 21h
code ends
end start
运行结果如下:
3、用多种循环方法实现1+2+3+…+20的程序(至少二种方法) 代码1:(31.ASM 31.OBJ 31.EXE)
DATA SEGMENT
X DW 0D
Y DW 20D
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV BX,X
MOV CX,Y
MOV AX,0
L1:
INC BX
ADD AX,BX
LOOP L1
MOV DX,AX
MOV AH,2
INT 21H
CODE ENDS
END START
运行结果1如下:(结果存于DX寄存器中)
实验代码2如下:(32.ASM 32.OBJ 32.EXE) DATA SEGMENT
Y DW 20D
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,Y
MOV AX,0
MOV BX,0
L1:
INC BX
ADD AX,BX
CMP BX,20
JNZ L1
MOV DX,AX
MOV AH,2
INT 21H
CODE ENDS
END START
运行结果2如下:(实验结果存于DX 寄存器中)
4、编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z 或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入
实验代码如下:(4.ASM 4.OBJ 4.EXE)
code segment
assume cs:code
start:
mov ah,1
int 21h
cmp al,0dh
je exit
cmp al,'0'
jb start
cmp al,'9'
jbe output1
cmp al,'A'
jb start
cmp al,'Z'
jbe output
cmp al,'a'
jb start
cmp al,'z'
jbe output
output1: mov dl,al
mov ah,2
int 21h
jmp start
output:mov ah,02h
mov dl,'c'
int 21h
jmp start
exit: mov ah,4ch
int 21h
code ends
end start
运行结果如下:
5、编写一个汇编语言程序,要求将BX寄存器内的小写字母用大写字母显示出来。
实验代码如下:(5.ASM 5.OBJ 5.EXE)BX寄存器中的测试数据位3132H CODE SEGMENT
ASSUME CS:CODE
START:
MOV BX,6162H
SUB BX,2020H
MOV DL,BL
MOV AH,02
INT 21H
MOV BL,BH
MOV DL,BL
MOV AL,02
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果如下图:
6、ADDR单元是存放数据的内存单元,要求将该内存单元中的字依次用十六进制数显示出来。
实验代码如下:(6.ASM 6.OBJ 6.EXE)测试数据为1EH,3DH,34H,98H DATA SEGMENT
ADDR DB 1EH,3DH,34H,98H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV SI,0
MOV DI,OFFSET ADDR
STEP:
MOV AL,[DI]
ADD DI,1
MOV BL,AL
MOV DL,AL
MOV CL,4
SHR DL,CL
CMP DL,9
JBE NEXT1
ADD DL,7
NEXT1: ADD DL,30H
MOV AH,2
INT 21H ;显示高位ASCII码
MOV DL,BL
AND DL,0FH
CMP DL,9
JBE NEXT2
ADD DL,7
NEXT2: ADD DL,30H
MOV AH,2
INT 21H ;显示低位ASCII码
INC SI
CMP SI,4
JNZ STEP
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END START
运行结果如下:
四、实验心得体会
本次实验主要是循环结构的程序。
通过本次实验,学习汇编语言中循环结构类型的程序的编辑、编译与连接,更好的掌握分支程序的结构。
通过本次实验,我对循环结构有了一定的理解,尤其是LOOP循环指令,对于cmp指令和JZN、JZ等指令也有了一定的了解
实验过程是一个不断探索和实践,发现错误和改正错误的一个过程。
而在实验四这个试验中,首先,要解决的问题是熟悉和了解汇编语言中分支结构的内容。
在完成实验内容的过程中,由于还是处于摸索过程中,所以刚开始的进度很慢,是对着实验过程,一步一步的执行,还要不时的进行截图。
但,熟能生巧,到后来的实验就进行的比较快。
通过本次实验,掌握了汇编语言中循环结构这一部分的内容,通过上级实验,更好的理解我们在课本上看到的循环结构的内容,让我们在实验中更深一步的理解和应用。