汇编语言实验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,进一步掌握调试工具的使用方法。
二、实验内容1,从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送到n单元,吧累加和送入sum单元。
实验源代码:DATAS SEGMENTN DW ?SUM DW ?DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DA TASMOV DS,AXINIT:MOV AX,0MOV BX,0MOV CX,0AGAIN:ADD BX,1ADD AX,BXADD CX,1CMP AX,1000JB AGAINMOV N,CXMOV SUM,AXMOV AH,4CHINT 21H CODES ENDSEND START开始初始化AX=0,CX=0,BX=0 BX=BX+1AX=AX+BX,CX=CX+1AX<=1000 n=CX,sun=AX结束实验运行结果:0x002D的值为45,即是n的值,0X040B的值是1035,即是sum的值。
三、实验习题2,编程序统计学生的数学成绩,分别归类90~99分,80~89分,80~79分,60~69分及60分一下,并将各段的人数送入内存单元中。
源代码:data SEGMENTbuf db 46,36,50,63,67,76,74,82,87,93,97,99 cnt equ $-bufs9 db ?s8 db ?s7 db ?s6 db ?s5 db ?data ENDScode SEGMENTassume cs:code, ds:datamain PROC farmov ax,datamov ds,axxor ax,axxor bx,bxxor cx,cxxor dx,dxlea si,bufmov cx,cntlop1:cmp byte ptr[si],60jb next5cmp byte ptr[si],70jb next6cmp byte ptr[si],80jb next7cmp byte ptr[si],90jb next8jmp next9next5:inc dljmp nextnext6:inc dhjmp nextnext7:inc bljmp nextnext8:inc bhjmp nextnext9:inc aljmp nextnext:inc siloop lop1mov s9,almov s8,bhmov s7,blmov s6,dhmov s5,dlmov ah,4chint 21hcode ENDSEND MAIN运行结果:四、实验总结1,J B,(无符号数)小于等于则转移cf=1 或是zf=1;2,JAE,(无符号数)大于等于则转移cf=0或是zf=1;。
汇编(循环、分支、子程序)实验报告
分别为十个成绩、成绩总个数、分段的5个区间申请内存单元,初始化数据段;将AX,BX,CX压栈,保留原始数据。选取第一个成绩,存入AX中,该数据除以10,得到商存入BX,判断商的所属区间,给所属区间加1,继续下一个,循环直到十个全部判断结束,pop出栈,得到属于各区间的成绩个数,程序结束。
2.源程序清单
2.源程序清单
datasegment
xdw 1ah
ydw 0ah
zdw 01h
maxdw ?
dataends ;数据段定义
codesegment
assume ds: data, cs: code
start:
mov ax, data
mov ds, ax ;初始化数据段
mov ax, x
cmp ax, y
《汇编语言程序设计》实验报告
实验名循环、分支、子程序设计实验室实验楼实验日期2014-06-09
一、实验目的及要求
1.熟悉命令格式,功能,加强对指令系统的理解
2.编写简单循环、选择、子程序的结构程序
3.单步跟踪调试,观察寄存器的变化和指令执行的结果
二、实验环境
硬件环境:一台微型计算机
软件环境:windows xp,debug环境,masm
2.源程序清单
datarea segment;定义数据段
buffer db 80 dup(?) ;预申请了以buffer为首地址的内存单元
flag db ?
datarea ends
prognam segment;定义编码段
main proc far
assume cs:prognam,ds:datarea
(5).初始数据段
(6).分别将AX,BX,CX,SI压栈,保留初始数据,
汇编语言循环程序设计
汇编语言循环程序设计引言:汇编语言是一种底层的计算机语言,它使用指令来操作计算机的硬件。
在汇编语言中,循环程序设计是一种常见的编程技巧,它可以使程序重复执行一段代码,达到循环的效果。
本文将介绍汇编语言中的循环程序设计,并通过示例代码详细解释其原理和应用。
一、循环的基本原理在汇编语言中,循环的实现依赖于条件判断和跳转指令。
循环程序通常包括以下几个步骤:1. 设置循环计数器的初始值;2. 执行循环体的代码;3. 更新循环计数器的值;4. 判断循环条件是否满足,如果满足则跳转到循环体的起始位置,否则结束循环。
二、示例代码:计算1到n的和下面是一个简单的汇编语言循环程序,用于计算从1到n的和(假设n已经存储在寄存器中):```asmMOV CX, n ; 将n的值存储到CX寄存器中MOV AX, 0 ; 将累加和的初始值设为0LOOP_START: ; 循环体的起始位置ADD AX, CX ; 将CX的值累加到AX中DEC CX ; 将CX的值减1CMP CX, 0 ; 判断CX的值是否为0JNZ LOOP_START ; 如果CX不为0,则跳转到循环体的起始位置; 循环结束后,累加和存储在AX寄存器中```以上代码中,使用了CX寄存器作为循环计数器,每次循环将CX的值减1,直到CX的值为0时跳出循环。
循环体中将CX的值累加到AX寄存器中,实现了从1到n的求和。
三、循环的嵌套在实际编程中,循环常常需要嵌套使用,以实现复杂的功能。
下面是一个示例代码,用于打印一个矩形图案:```asmMOV CX, 5 ; 设置外层循环的次数MOV DX, 5 ; 设置内层循环的次数OUTER_LOOP: ; 外层循环的起始位置PUSH CX ; 保存外层循环计数器的值INNER_LOOP: ; 内层循环的起始位置PUSH DX ; 保存内层循环计数器的值; 打印一个字符,如使用INT 21H中断POP DX ; 恢复内层循环计数器的值DEC DX ; 内层循环计数器减1CMP DX, 0 ; 判断内层循环计数器是否为0JNZ INNER_LOOP ; 如果不为0,则跳转到内层循环的起始位置POP CX ; 恢复外层循环计数器的值DEC CX ; 外层循环计数器减1CMP CX, 0 ; 判断外层循环计数器是否为0JNZ OUTER_LOOP ; 如果不为0,则跳转到外层循环的起始位置```以上代码中,使用了两个计数器CX和DX,分别控制外层循环和内层循环的次数。
汇编实验报告--循环程序设计实验
实验三循环程序设计实验学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握循环程序的设计方法;2.学会针对不同的问题,选用不同的组织循环的方法;3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
二、实验内容1.计算y=x!X为8位无符号数Y为16位无符号数2.计算z=x+y其中x,y为5字节压缩BCD码,x,y,z的存放地址自定。
3. y=x/32,要求得商的整数和小数,x为四字节无符号数三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求1.编写实验内容要求的两个程序;2.写出调试以上程序,即修改程序参数,检查结果的操作方法;3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。
五、主要实验步骤一.算法过程1.分析算法思想2.根据算法分析3.编写程序测试,记录结果4.分析结果5总结二.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改BL内容的方法;(2)对DSPKEY.EXE键入不同的字符,分别进行调试;(3)在MS-DOS下运行这两个.EXE文件。
六.心得体会实验让我了解了循环程序设计的应用。
让我明白如何应用循环程序设计。
源代码:code segmentassume cs:code,ds:codeorg 100hstart:push cspop dspush cspop esQ0:lea dx,Tipsmov ah,9int 21hQ1:mov ah,0int 16hcmp al,1bhjz exitcmp al,'0'jb Q1cmp al,'8'ja Q1mov ah,0ehint 10hsub al,30h;'0'or al,aljnz Q2mov ax,1 ;0!=1 jmp Q4Q2:mov ah,0 mov cx,axmov al,1xor dx,dxQ3:mul cxloop Q3Q4:cldlea di,Result add di,2lea bp,Table mov cx,5Q5:xor dx,dx div word ptr [bp] or al,30hstosbmov ax,dxadd bp,2loop Q5lea dx,Result mov ah,9int 21hjmp Q0exit:mov ah,4chint 21hcode endsend start。
实验五汇编语言程序设计实验(一)
实验五汇编语言程序设计实验(一)一、实验目的1、了解和掌握汇编语言子程序和主程序的设计。
2、掌握循环程序的设计。
3、掌握汇编语言主程序与子程序的调用和参数传递。
4、进一步熟悉在PC机上建立,汇编,链接,调试和运行8086、8088汇编语言程序的过程。
二、实验内容1、复习汇编语言源程序的上机过程:2、编写一个完整程序(包含循环设计和子程序设计)在以strg为首地址的缓冲区中存放着1个字符串,以-1作为结束标志,编程统计字符串长度,并将结果存入lenth单元。
要求统计字符串用子程序完成。
data segmentstrg db ‘abcd’,-1lenth dw ?data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea dx,strgcall scountmov lenth,bxmov ah,4chint 21hscount proc nearpush sixor bx,bxmov si,dxnext:cmp byte ptr[si],-1jz overinc bxinc sijmp nextover:pop siretscount endpcode endsend start三、实验器材IBM PC 微机一台四、实验要求1、正确理解本次实验的目的,内容和原理。
2、能编写相应的程序五、实验报告要求完成下面任务:从键盘输入1个长度小于100的字符串,存入以buff 为首地址的缓冲区,其中如有大写字母,要求用子程序转换成小写字母,字符串以回车键作为结束。
写出操作步骤,程序清单,程序注释,实验现象。
汇编语言实验五循环程序设计1
实验五循环程序设计一实验类型:验证性实验目的:1、掌握循环程序的设计方法2、学会针对不同的问题,选用不同的组织循环的方法。
实验步骤:1、进入DOS环境2、输入命令:path c:\windows\command;c:\turbo\masm保证实验过程中使用的所有命令都在当前路径直接调用3、启动EDIT编辑器输入程序代码4、检查语法错误,如无错误以ASM为后缀名保存文件(如文件名chen.asm)5、运行命令MASM CHEN.ASM生成OBJ文件6、如果出错请回到第3步再纠正错误7、运行命令LINK CHEN.OBJ(此时提示没有堆栈错误请忽略)生成EXE文件8、运行DEBUG调入可执行程序DEBUG CHEN.EXE(以下DEBUG 命令请参看第一次实验内容)9、执行反汇编U10、查看程序结束地址11、运行G 命令运行程序12、运行D和R命令查看相应的内存单元和寄存器的数据是否与结果一致,如果不一致回到第3步纠正错误,也可以运行T命令逐条运行程序寻找错误指令位置再做修改。
实验内容:1、在数据段有一字数组array,要求编写程序在数组中在数组中查找某一数据并且删除它2、在数据段有一按从小到大排序的字数组array,要求编写程序在数组中在数组中查找某一数据的合适位置插入该元素data segmentx dw ?array dw 1,2,3,4,6,7arrayend dw ?s dw 5data endscode segmentmain proc farassume cs:code,ds:datastart:push dssub ax,axpush axmov ax,datamov ds,ax;***************************mov ax,slea si,array-2lea di,arrayendmov cx,(arrayend-array)/2loop1:add si,2jcxz l2dec cxcmp ax,[si]jg loop1inc cxl1:jcxz l2dec cxmov bx,[di-2]mov [di],bxsub di,2jmp l1l2:mov [di],ax;***************************ret main endp code endsend start。
汇编语言程序设计之循环程序
汇编语言程序设计之循环程序汇编语言中的循环程序是一种重复执行一定次数的程序结构。
循环程序通常用于处理大量数据、实现排序算法等需要重复执行的任务。
下面将介绍几种常见的循环程序设计方法。
1.计数循环计数循环是一种每经过一次循环,计数器的值增加或减少一个固定量的循环程序。
以下是一个使用计数循环实现输出从1到10的循环程序的汇编代码示例:```MOVCX,10;初始化计数器为10LOOP_START:MOVAH,02H;设置系统调用功能号为02HMOVDL,'0';设置要输出的字符为'0'ADDDL,CL;将计数器的值加到字符上INT21H;调用系统调用,输出字符INCCL;计数器加1CMPCL,10;比较计数器与10JLELOOP_START;如果计数器小于等于10,继续循环```2.条件循环条件循环是一种根据一定条件决定是否继续执行循环的循环程序。
以下是一个使用条件循环实现求1到10的累加和的汇编代码示例:```MOVCX,10;初始化计数器为10MOVAX,0;初始化累加和为0LOOP_START:ADDAX,CX;将计数器的值加到累加和上DECCX;计数器减1CMPCX,0;比较计数器与0JNZLOOP_START;如果计数器不等于0,继续循环```3.外层循环和内层循环在一些情况下,需要在一个循环中嵌套另一个循环,这就是外层循环和内层循环的概念。
以下是一个使用外层循环和内层循环实现输出一个5x5的乘法表的汇编代码示例:```MOVCX,5;设置外层循环次数为5OUTER_LOOP:MOVDX,1;初始化内层循环计数器为1INNER_LOOP:MOVAX,CX;外层循环计数器值存储到AX寄存器MULDX;AX=AX*DXMOVBX,AX;结果存储到BX寄存器MOVAH,02H;设置系统调用功能号为02HMOVDL,'';设置要输出的字符为空格INT21H;调用系统调用,输出字符MOVAX,BX;将结果从BX寄存器移回AX寄存器MOVAH,02H;设置系统调用功能号为02HADDAL,'0';将数值转化为字符INT21H;调用系统调用INCDX;内层循环计数器加1CMPDX,5;比较内层循环计数器与5JLEINNER_LOOP;如果内层循环计数器小于等于5,继续内层循环MOVAH,02H;设置系统调用功能号为02HMOVDL,0AH;设置要输出的字符为换行符INT21H;调用系统调用,换行DECCX;外层循环计数器减1CMPCX,0;比较外层循环计数器与0JNZOUTER_LOOP;如果外层循环计数器不等于0,继续外层循环```以上是三种常见的循环程序设计方法的汇编代码示例。
汇编语言程序设计实验报告
实验报告实验名称汇编语言程序设计||专业班级:信息安全学号:姓名:实验一汇编语言上机过程和Debug常用调试命令一.实验目的:学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法。
二.实验题目:熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。
在调试过程中,学习及掌握debug程序的各种操作命令。
三.问题描述:试编写一程序:比较两个字符串string1和string2所含的字符是否相同,若相同则显示‘match’; 否则,显示‘no match’。
四.方法说明:a) 使用ws、tc或EDIT编辑程序来建立源文件,然后存盘,使系统返回DOS。
b) 用汇编程序masm(或asm)对源文件汇编产生目标文件obj如:汇编指示出错则需重新调用编辑程序修改错误,直至汇编通过为止。
c) 用连接程序link 产生执行文件EXE.d) 执行程序,可直接从DOS执行程序。
e) 使用debug程序调试程序的方法。
五.实验步骤:1.调用字处理程序EDIT 建立以sample.asm文件datarea segmentstring1 db ‘move the cursor backward.’string2 db ‘move the cursor backward.’mess1 db ‘Match..’,13,10,’$’mess2 db ‘No match!..’,13,10,’$’datarea endsprognam segmentmain proc farassume cs:prognam,ds:datarea,es:datarea start:push dssub ax,axpush axmov ax,datareamov ds,axmov es,axlea si,string1lea di,string2cldmov cx,25repz cmpsbjz matchlea dx,mess2jmp short dispmatch:lea dx, mess1disp:mov ah,09int 21hretmain endpprognam endsend start2.对源文件汇编产生目标文件obj D:\masm 文件名。
循环程序设计实验报告
学号:0740303104姓名:雷凤循环程序设计实验报告一、实验目的:1、了解和掌握比较循环程序的组成部分,重复控制指令的功能、作用和方法。
2、学会循环程序设计的方法。
3、学习汇编语言输出输入语句的设计。
二、实验要求:1、具体了解和掌握循环程序的组成部分,重复控制指令的使用和在使用时应注意的问题2、学习循环序设计的一般方法。
三、实验内容1、实验任务设有N个学生的某科成绩(百分制),已按学号的次序存放在以STUD 为首址的字单元数组中,现要求按成绩的高低记入名次,并把名次填入成绩所在的字单元的高字节中。
字单元的格式为2、实验的原理这个实验要用循环的嵌套,内外循环都循环6次,刚开始时将所有的名次都置1,外循环从第一个成绩开始依次与每一个学生(包括自己)的成绩比较大小,要是小于,相应的名次就加1,再将第二个成绩与所有的分数依次比较大小,一直循环6 次,就能得出名次排序了,将相应的名次分别保存在dl 低字节中,也便于输出名次。
3、程序设计流程图开始BX<-STUD存区首址CX<-外循环次数DL<-1AL<-[BX]CX<-内循环次数Slv-STUD存区首址DL<-DL+1SI<-SI+2[BX+1]<-DLBX<-BX+2Slv-SI+2结束A:INC SIINC SILOOP LOP2POPCXmov[BX+1], dl ; 把结果保存到高地址INC BX; 修改地址INC BX 四、实验步骤1、编辑源程序,建立一个以后缀为 .ASM 的文件 .DATASSEGMENT; 此处输入数据段代码STUDDW78,65,89,90,58,99DATASENDSSTACKSSEGMENT; 此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMCES:CODES,DS:DATAS,SS:STACKSSTART:MOVAX,DATASMOVDS,AX; 此处输入代码段代码LEABX,STUDLOP1:PUSHCXMOVdl,1 ;dl 用来存放名次MO\AL,[BX];BX 的内容送给AL MOVCX,6取偏移地址 LOP2:CMPAL,[SI]JL LOP3JMP A; 比较大小 ; 小于就转 ;LOOP LOP LOP3:INC dl ; 小于,名次加 1; 修改地址add dl,30h ; 输出movah,02hint 21hLOOP LOP1 ; 回到外面的循环MOVAH,4CHINT 21HCODESENDSENDSTART2、汇编源程序,检查程序有否错误,有错时回到编辑状态,修改程序中错误行。
循环结构程序设计方案(汇编语言)
汇编语言实验报告实验名称:循环结构程序设计姓名:________________________学号:_________________班级:_________________一、实验内容1. 用多种循环方法实现1+2+3+…+20的程序(至少二种方法);2. 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入;(选做)3、编写一个汇编语言程序,要求将BX寄存器内的小写字母用大写字母显示出来。
4、A DDRI元是存放数据的内存单元,要求将该内存单元中的字依次用十六进制数显示出来。
二、实验目的1. 掌握循环程序的结构。
2. 掌握循环程序的设计、编写及调试方法。
3. 掌握循环程序设计的基本方法。
主要掌握几种基本的循环程序设计技巧,如计数法程序设计、当循环、直到循环等程序设计技术。
三、实验结果1、将内存中的数据块中(BUFF为起始地址)奇数和偶数分别存入以ADDR和ADDR开始的存储块中,并分别统计其中的奇、偶数,将统计结果存放在RESULT 开始的两个字存储单元中。
实验代码:(1.ASM 1.OBJ 1.EXE)data segme ntbuff dw 6,35,99,17,80,69,50,33addr1 dw 8 dup⑺addr2 dw 8 dup(?)result dw 0,0data endscode segme ntassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,8dmov si,0mov di,0mov bx,0mov dx,0L1:test buff[si],0001hje L2mov ax,buff[si]mov addr2[bx],axadd si,2add bx,2inc dldec cxjmp L1L2:mov ax,buff[si]mov addr1[di],axadd di,2add si,2inc dhdec cxjmp L1mov si,0mov byte ptr result[si],dhadd si,2mov byte ptr result[si],dl code endsend start运行结果如下:代码如下:(2. ASM 2.0BJ 2.EXE) data segme nt x dw 30dy dw 10ddata endscode segme ntassume cs:code,ds:datastart:push dssub ax,axpush axmov ax,datamov ds,axmov cx,xmov bx,ymov ax,0L1:add ax,bxloop L1mov dx,axmov ah,2int 21h3、用多种循环方法实现1+2+3+…+20的程序(至少二种方法)代码 1:( 31.ASM 31.0BJ 31.EXE)DATA SEGMENTX DW 0D Y DW 20D DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:PUSH DS SUB AX,AX PUSH AXMOV 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 ENDSEND START运行结果1如下:(结果存于DX 寄存器中)code ends end start运行结果如下:实验代码 2 如下:(32.ASM 32.OBJ 32.EXE)DATA SEGMENTY DW 20D DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:PUSH DS SUB AX,AX PUSH AXMOV AX,DATA MOV DS,AX MOV CX,Y MOV AX,0 MOV BX,0 L1:INC BX ADD AX,BX CMP BX,20 JNZ L1MOV DX,AX MOV AH,2 INT 21H CODE ENDSEND START运行结果2如下:(实验结果存于DX 寄存器中)4、编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>其ASCII码为ODH),则结束程序, 若为其它字符则不显示,继续等待新的字符输入实验代码如下:(4.ASM 4.0BJ 4.EXE)code segme ntassume cs:codestart:mov ah,1int 21hcmp al,Odhje exitcmp al,'0'jb startcmp al,'9'jbe output1cmp al,'A'jb startcmp al,'Z'jbe outputcmp al,'a'jb startcmp al,'z'jbe outputoutput1: mov dl,almov ah,2int 21hjmp startoutput:mov ah,02hmov dl,'c'int 21hexit: mov ah,4chint 21hcode endsend start运行结果如下:5、编写一个汇编语言程序,要求将BX寄存器内的小写字母用大写字母显示出来。
- 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指
令的使用方法。
欢迎下载,谢谢观看!资料仅供参考学习。