汇编语言实验5-循环程序设计
实验五多重循环程序

EQU
符号定义伪指令EQU就是用于给某个表 达式赋予一个名字,或者说是使某个字符 名等于某个表达式的值 用法: 名字 EQU 表达式
地址计数器$ 地址计数器
在汇编程序对源程序汇编的过程中,使用地址计数器来保存当前正在汇编的 指令的地址。地址计数器的值在汇编语言 汇编语言中可用$来表示。 汇编语言 当$用在伪指令 伪指令的参数字段时,它所表示的是地址计数器的当前值 伪指令 汇编语言允许用户直接用$来引用地址计数器的值,例如指令: 汇编语言 JMP $+ 6 当$用在伪指令 伪指令的参数字段时,则和它用在指令中的情况不同,它所表示的是 伪指令 地址计数器的当前值。例如指令: ARRAY DW 1, 2, $+ 4, 3, 4, $+ 4 假设汇编时ARRAY 分配的偏移地址为0074H,则汇编后,$+ 4所在的两个 字单元: (ARRAY+4)=0078+4=007CH (ARRAY+0A)=007E+4=0082H
实验五、多重循环程序
实验目的: ①掌握多重循环程序和排序程序设计方法。 ②掌握带符号数的比较转移指令:JL,JLE,JG,JGE ③伪指令EQU及操作符‘$’的使用。转移指令JMP p133页
1)段内直接转移 2 )段内间接转移 3)段间直接转移 4)段间间接转移 JMP lable JMP BX OR JMP WORD PRT[BX+DI] JMP FAR LABLE JMP OPRD OR JMP DWORD PTR [BX]
条件转移指令
JCXZ JG/JNLE JGE /JNL JS JNX JA/JNBE JAE/JNB JL/JNGE JLE /JNG JO JNO
条件转移指令JCC(P135页) 所有的条件转移指令都是直接寻址方式的短转移,即只能在以当 前IP值为中心的-127~+128字节范围内转移.条件转移指令不影 响标志位
汇编语言程序设计_第5章 分支循环程序设计(参考答案)

第5章分支、循环程序设计本章要点: 转移指令的寻址方式及其执行过程,控制转移类指令的使用,分支和循环程序的设计和应用。
程序调试的方法,常见问题的程序设计方法。
一、单项选择题5.1.1条件转移是根据标志寄存器中的标志位来判断的,条件判断的标志位共有( B )位。
A. 4B. 5C. 6D. 95.1.2用一条条件转移指令一次可以实现( A )个分支。
A. 2B. 3C. 4D. N5.1.3 条件转移指令的转移范围是(A)。
A. -128~127B. 0~255C. 0~65535D. -32768~327675.1.4 设A为字变量,B为标号,下列指令中不正确的是(D)。
A. MOV AX,AB. JNZ BC. JMP [SI]D. JMP B[BX]5.1.5 下述指令中影响CF标志位的是(A)。
A. SHL AL,1B. MOV AL,1C. JC LD. JNC L5.1.6 下述指令中不影响CF标志位的是(A)。
A. INC SIB. SUB SI,0C. NEG ALD. TEST AL,15.1.7 在多重循环程序设计中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B)。
A. 不必考虑B. 必须重新设置C. 必须清0D. 必须置15.1.8 当设计一个程序时,最重要的是(B)。
A. 程序的结构化B. 能使程序正常运行并实现功能C. 程序的执行速度快D. 程序占用的存储空间小*5.1.9 如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下一指令的操作码,那么这条指令的位移量是(C)。
A. 1EHB. 20HC. 0DEHD. 0E0H*5.1.10 如果“JGE P”指令的操作码放在0050H,该指令的位移量是34H,执行完这条指令转移取下一条指令的偏移地址是(C)。
A. 82HB. 84HC. 86HD. 88H二、填空题5.2.1 当下面循环程序中的划线处填上一个什么数字时,执行的循环次数最多?MOV CX,____0______MOV AX,0L:INC AXLOOP L5.2.2 当两个数进行比较后,执行__JE L(JZ L)表示两数相等则转移到L。
汇编语言循环程序实验报告

一、实验目的(1) 加深对循环结构的理解;(2) 掌握循环程序的设计方法;(3) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容1.已知以BUF为首地址的字存储区中存放着8个有符号二进制数,是编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。
同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。
2.设STR字符串是以0结尾。
试编写一个把字符串中的所有大写字母改为小写字母的程序并将转换后的字符串显示输出。
3.试编程从自然数1开始累加,直到累加和大于5050为止,统计被累加的自然数的个数,并把统计的个数送入COUNT单元,累加和送入TOTAL单元。
三、算法描述流程图实验内容1、2、3的流程图分别为图1、图2、图3。
图1 图2 图3四、实验步骤1.已知以BUF为首地址的字存储区中存放着8个有符号二进制数,是编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。
同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。
1)输入源程序:DATA SEGMENTBUF DW 23,123,-12,-210,45,0,90,-453BUF1 DW 8 DUP(0)BUF2 DW 8 DUP(0)A DW ?B DW ?DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXLEA BX, BUFLEA SI, BUF1LEA DI, BUF2MOV A,0MOV B,0MOV CX,8L0: MOV AX,[BX]CMP AX,0JGE L1MOV [DI],AXADD DI,2INC BJMP NEXTL1: MOV [SI],AXADD SI,2INC ANEXT: ADD BX,2LOOP L0MOV AH, 4CHINT 21HCODE ENDSEND START2)运行程序。
汇编语言循环程序设计

RET
HEXASC
ENDP
CODE ENDS
END START
⑵ 用伪指令方法编程:
DATA SEGMENT
HEXDATA DW 4D7EH
RESULT DB 4 DUP(?)
•
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE;DS:DATA
STAห้องสมุดไป่ตู้T: MOV
AX, DATA
[例3] 在xx单元开始的连续单元中存放有10个无符 号数,从中找出中最大者送y• y单元。
根据题意,我们把第一个数先送入AL寄存器中, 然后将AL中的数与后面的9个数逐个进行比较。如果AL 中的数较小,则两数交换;如果AL中的数大,则不交换 。在比较过程中,AL中始终保持较大的数,这样,比较 9次后,则最大的数在AL中,最后把AL中的数(最大者 )存入yy单元。
MOV BX, [SI]
NEXT: MOV AX, BX
AND AL, 0FH
CALL HEXASC
MOV [DI], AL
INC DI
PUSH CX
MOV CX, 4
SHR BX, CL
POP CX
LOOP NEXT
LEA
MOV STD LOOP1: LODSB MOV MOV INT LOOP MOV MOV INT MOV INT
YSEG SEGMENT
•
CALL SUBT1
MOV AH,4CH INT 21H SUBT1 PROC FAR
YSEG ENDS
…
RET SUBT1 ENDP XSEG SEGMENT
2.寄存器内容的保护和恢复
通常主程序和过• 程的设计是分开的, 因而他们所使用的寄存器往往会发生冲 突。为避免冲突,应在进入过程时,将 该过程所用到的寄存器内容保护起来, 称为保护现场。而从过程返回主程序前 ,再将这些寄存器的内容恢复,称为恢 复现场。保护现场和恢复现场通常分别 用堆栈压入指令和弹出指令来实现。例 如:
汇编语言程序设计实验指导

汇编语言程序设计实验指导【实验提要】以下列举的10个实验,都是以Intel的8086及后续系列微处理器的指令系统为核心,采用宏汇编工具MASM6. X以及调试工具DEBUG或DEBUG32,针对本教材所述内容进行相关的上机实践。
旨在帮助学生加深认识和理解理论教学知识,通过大量的上机实验熟悉8086 CPU的指令功能、用途和使用技巧,进而提高汇编语言程序设计的能力。
(带*号的为选作内容)实验一调试工具DEBUG的应用实验目的通过实验掌握下列知识:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG的功能;2、DEBUG命令: A,D,E,F,H,R,T,U的使用;3、BCD码、ASCII码及用十六进制数表示二进制码的方法;4、寄存器: AX,BX,CX,DX,FLAGS,IP。
内容及步骤注:本次实验可以参照教材上关于DEBUG的叙述内容进行。
一、DEBUG 命令使用1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DEBUG, 进入调试环境,显示提示符 '- '。
2、用命令 F 200 220 'AB' 将'AB'的两个ASCII码循环填入内存。
注:第一个参数200是当前段的起始偏移地址,第二个参数220是终了偏移地址,第三个参数‘AB’是被填入的数值,若不给出第二个参数则填入128(8行)个字节。
3、用命令 D200 观察内存中的十六进制码及屏幕右边的ASCII字符。
4、用命令 F230 23F 12 重复上二项实验,观察结果并比较。
5、用命令 E200 41 42 43 44 45将A-E的ASCII码写入地址为200开始的内存单元中,再用D命令观察结果,看键入的十六进制数和ASCII码的对应关系。
6、用H命令检查下列各组十六进制数的和与差(补码表示):(1)56H,34H (2)23H,45H (3)AB,3045H注:输入 H 12 34 则在下一行显示0046 FFDE,即二者的补码和与差。
汇编语言实验5-循环程序设计

汇编语言实验报告Assembly Language Programming Lab Reports______________________________________________________________________________班级:_________ 姓名:___________ 学号:___________ 实验日期:_____________学院:_____计算机与通信工程学院____ 专业:_______计算机科学与技术___________实验顺序:___实验五____ 实验名称:____________循环程序设计________________实验分数:_______ 考评日期:________ 指导教师:______________________________________________________________________________一.实验目的1、掌握两种循环结构,DO WHILE的循环结构用CMP指令和条件转移指令构成。
DO UNTIL用loop,loope,loopne这三种指令实现。
2、掌握以下指令掌握循环指令,loop,loope,loopne。
掌握串处理指令,movs,cmps,scas,lods,stos 以及和他们联合使用的重复前缀指令rep,repz,repnz。
掌握伪指令EQU 及操作符'$'的使用。
掌握cmp,test和条件转移指令构成的循环结构。
3、掌握循环程序的设计过程,写出设计方法,给出程序框图,写出循环程序。
4、掌握多重循环中,可以由内层循环向外层循环跳转,或者直接向外层程序跳转,但是不允许从外向内跳转。
5、会用循环实现排序算法。
______________________________________________________________________________二.实验环境操作系统:windows xp编译程序:masm 5.0______________________________________________________________________________三.实验原理1、loop指令循环2、二层、三层循环嵌套______________________________________________________________________________四.实验步骤及结果分析1.简单的循环程序。
汇编-循环与分支程序设计

方法A
MOV DL,0DH MOV AH,06H INT 21H MOV DL,0AH MOV AH,06H INT 21H
方法B
MOV DL,0AH MOV AH,06H INT 21H MOV DL,0DH MOV AH,06H INT 21H
记住以下ASCII值
退格:08H(即8) 空格:20H(即32) 换行:0AH(即10) 回车:0DH(即13) 0 :30H(即48) a :61H(即97) A :41H(即65)
程序流程图
开始
DX=A
DX=A+B BX=DX DX左移3位 BX左移1位
DX=BX+DX-500
结束
编写程序
DATA BUFA BUFB RESULT
SEGMENT DW ? DW ? DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CODE
➢ 循环控制部分:判断循环条件满足与否,常用方法:计数控制、特 征值控制、地址边界控制等。
➢ 常用指令
[1].LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;
[2].各种跳转指令;
特别要注意循环入口和循环次数的正确设置、地址指针及循环控
制条件的修改等。否则会得不到期望的结果。
➢ 多重循环程序设计循环嵌套
INT 21H
不回显在屏幕上
2.键盘一次输入一个字符串的方法:
串地➢址例存如入(,DS在:D数X)据、调区用定参义数的为字10送符A缓H冲区如下:
MOV MOV MOV MOV MOV
DABADDAXuHSX,f,,,TfASAO0eEXfArGf,Hsc/eSASBo/tBEuu设TCufnGRf置BftTMfueILeNIr/frENE/fGT/设e/NN/r/置BTB/2uu/1存ffBHDffDuD功入eefBBBrrf能字是的er参符存段的33?数串放地偏22 为的输址移D0最入U存地APH大字入址(长符D存S?度串入)并的DX存缓入冲B区uffer的首字节;
第五章 循环与分支程序设计

continue: add loop mov loop ……
2. 分支程序设计
? ? … case 1 case 2 case n case 1 case 2 case n
CASE 结构
(1) 逻辑尺控制 (2) 条件控制
IF-THEN-ELSE 结构
(3) 地址跳跃表(值与地址有对应关系的表) 地址跳跃表(值与地址有对应关系的表)
13
x(x1,x2,…… x2,……,x10) 例:有数组 x(x1,x2,……,x10) 和 y(y1,y2,……,y10), (z1,z2,…… z2,……,z10) 编程计算 z(z1,z2,……,z10) z1 = x1 z2 = x2 z3 = x3 z4 = x4 z5 = x5 z6 = x6 z7 = x7 z8 = x8 z9 = x9 + y1 + y2 - y3 - y4 - y5 + y6 - y7 - y8 + y9
3
1. 循环程序设计
初始化
初始化
N N
控制条件
Y
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
4
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
5
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1
2 3
4je lea L: shr jnb jmp add1: add jmp continue: …… routine1: …… routine2: …… al, 0
(寄存器间接寻址) 寄存器间接寻址)
continue bx, branch_table ;逻辑右移 al, 1 逻辑右移 ;jnb=jnc add1 ;段内间接转移 word ptr[bx] bx, type branch_table L
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言实验报告
Assembly Language Programming Lab Reports
______________________________________________________________________________
班级:_________ 姓名:___________ 学号:___________ 实验日期:_____________
学院:_____计算机与通信工程学院____ 专业:_______计算机科学与技术___________
实验顺序:___实验五____ 实验名称:____________循环程序设计________________
实验分数:_______ 考评日期:________ 指导教师:
______________________________________________________________________________
一.实验目的
1、掌握两种循环结构,DO WHILE的循环结构用CMP指令和条件转移指令构成。
DO UNTIL用loop,loope,loopne这三种指令实现。
2、掌握以下指令
掌握循环指令,loop,loope,loopne。
掌握串处理指令,movs,cmps,scas,lods,stos 以及和他们联合使用的重复前缀指令rep,repz,repnz。
掌握伪指令EQU 及操作符'$'的使用。
掌握cmp,test和条件转移指令构成的循环结构。
3、掌握循环程序的设计过程,写出设计方法,给出程序框图,写出循环程序。
4、掌握多重循环中,可以由内层循环向外层循环跳转,或者直接向外层程序跳转,但是不允许从外向内跳转。
5、会用循环实现排序算法。
______________________________________________________________________________
二.实验环境
操作系统:windows xp
编译程序:masm 5.0
______________________________________________________________________________
三.实验原理
1、loop指令循环
2、二层、三层循环嵌套
______________________________________________________________________________
四.实验步骤及结果分析
1.简单的循环程序。
(1)写出y=5!的程序段。
data segment
info db 'The 5!=$'
t db '0123456789ABCDEF'
data ends
stack segment
db 512 dup(?)
stack ends
code segment
assume cs:code,ds:data
start:
mov ax,data mov ds,ax
mov ax,stack mov ss,ax
.
mov sp,512
mov dx,offset info
mov ah,9 int 21h
mov cx,4
mov al,1
mov bl,2
x:
mul bl inc bl
loop x mov cx,4
y:
push cx mov cl,4
rol ax,cl mov si,ax
and ax,0fh
mov bx,ax
mov dl,t[bx]
mov ah,2
int 21h
mov ax,si
pop cx
loop y
mov ah,4ch int 21h
code ends
.
end start
运行截图:
(2)在程序为N的字节数组value中取出第一个负数存在BL中。
代码见6-1.asm和6-2.asm
data segment
info db 'The ID of th first negative number is:$'
t db '0123456789ABCDEF'
t1 db 1,3,5,7,-9,11,-13,15
count equ $-t1
data ends
stack segment
db 512 dup(?)
stack ends
code segment
assume cs:code,ds:data
.
start:
mov ax,data mov ds,ax
mov ax,stack mov ss,ax
mov sp,512
mov dx,offset info
mov ah,9
int 21h
mov cx,count
mov bx,0
x:
mov al,t1[bx]
inc bx
and al,10000000b
loopz x
dec bx
mov ax,bx
mov cx,4
y:
push cx
mov cl,4
rol ax,cl
mov si,ax
and ax,0fh
mov bx,ax
mov dl,t[bx]
mov ah,2
int 21h
mov ax,si
pop cx
loop y
mov ah,4ch
int 21h code ends
end start
运行截图:
2.串处理程序
(1)查找CATI表中的字符@,找到后将其保存到SIGN单元,其位置值保存到ADDI单元。
data segment
value dw 1,2,3,4,5,6,7,8,9
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data mov ds,ax
mov ax,value[4]
mov ah,4ch int 21h
code ends
end start
运行截图:
(2)在长度为N的字数组VALUE中取出第3个数保存到AX中。
data segment
value dw 1,2,3,4,5,6,7,8,9
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data mov ds,ax
mov ax,value[4]
mov ah,4ch int 21h code ends
end start
运行截图:
3.排序
数组table中存放8个小写字母computer。
编写程序,将它们按降序排序。
data segment
t db 'computer'
count equ $-t
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data mov ds,ax
mov cx,count
dec cx
bubble:
push cx
mov bx,0
change:
mov al,t[bx] cmp al,t[bx+1]
jae next
xchg al,t[bx+1]
mov t[bx],al
next:
inc bx
loop change
pop cx
loop bubble
mov ah,4ch int 21h
code ends
end start
运行截图:
4.综合练习
(1)上课练习题目
分别统计3个班级中某科成绩优秀的人数和不及格的人数。
data segment
a d
b 62,93,56,91,34,87,92,51
db 93,72,84,52,99,48,83,76
db 46,81,92,83,84,68,53,88
m dw 3
n dw 8
max db 3 dup(0)
min db 3 dup(0)
data ends
code segment
assume cs:code,ds:data
start:
.
mov ax,data mov ds,ax
mov cx,m
mov bx,0 mov si,0
x:
push cx mov cx,n
y:
mov al,a[bx]
cmp al,90
jae let1
cmp al,60
jae let2
inc min[si]
jmp let2
let1:
inc max[si]
let2:
inc bx
loop y
inc si
pop cx
loop x
mov ah,4ch int 21h
code ends
end start
运行截图:
____________________________________________________________________________
五.实验心得疑问建议
通过本次汇编试验,掌握了循环程序设计的基本方法,同时了解了loop指
令的使用方法。
欢迎下载,谢谢观看!资料仅供参考学习。