理工 汇编语言 实验二

合集下载

汇编实验报告2

汇编实验报告2

试验二汇编语言实验
一、实验性质:必做、设计性
二、实验目的:
学习算术运算指令、十进制调整指令、键盘输入、光标定位、屏幕及显示缓冲区等指令的用法;熟练掌握DEBUG的使用方法。

三、实验内容:
用汇编语言编写程序:从键盘输入两个一位的十进制数,做加法运算。

通过实验掌握汇编语言程序的基本编写方法。

四、实验步骤:
(1)建立asm文件
(2)用汇编程序masm对源文件汇编产生目标文件obj
(3)用连接程序link产生执行文件exe
(4)执行程序
附:
code segment assume cs:code start:
mov cx,2
mov bl,0 next:
mov ah,1
int 21h
sub al,30h
jc next
cmp al,9h
ja next
add al,bl
daa
mov bl,al
mov dl,13 mov ah,2
int 21h
mov dl,10
int 21h
loop next
mov cl,4
mov dh,2
next1:
rol bl,cl
mov dl,bl
and dl,0fh
add dl,30h mov ah,2
int 21h
dec dh
jnz next1
mov ah,1
int 21h
mov ah,4ch
int 21h
code ends
end start。

汇编实验2-循环程序设计-实验报告

汇编实验2-循环程序设计-实验报告

汇编实验2-循环程序设计-实验报告一、实验目的1、了解循环程序设计的方法2、理解汇编语言中循环指令的使用3、掌握汇编语言中常用的循环结构二、实验原理1、循环指令循环指令是计算机中常用的一种控制结构,其作用是重复执行一定的操作。

在汇编语言中,常用的循环指令有LOOP、LOOPE、LOOPNE等,具体功能如下:(1)LOOP:重复执行指定次数的操作;(2)LOOPE:执行操作直到CX寄存器为0或ZF寄存器为1;(3)LOOPNE:执行操作直到CX寄存器为0或ZF寄存器为0。

LOOP指令的语法格式如下:LOOP label其中,label表示循环的目标地址。

2、循环结构循环结构是计算机程序设计中常用的一种结构,其基本形式包括:while、do...while、for等。

在汇编语言中,常用的循环结构有以下两种:(1)无限循环结构:该结构适用于需要不停顿地进行某项操作的情况,底层逻辑基于测试指令;(2)计数器循环结构:该结构适用于需要循环指定次数的情况,底层逻辑基于循环指令。

三、实验内容1、使用循环指令实现计算1~10的和;2、使用循环结构实现计算1~10的和。

四、实验步骤1、使用循环指令实现计算1~10的和。

(1)将计数器初始化为10,即MOV CX,10;(2)将累加器初始化为0,即MOV AX,0;(3)将当前计数器值加到累加器中,即ADD AX,CX;(4)将计数器减1,即DEC CX;(5)判断计数器是否为0,若不为0,则执行第3步;若为0,则跳转到计算结果的部分。

2、使用循环结构实现计算1~10的和。

(1)将计数器初始化为10,即MOV CX,10;(2)将累加器初始化为0,即MOV AX,0;(3)将当前计数器值加到累加器中,即ADD AX,CX;(4)将计数器减1,即DEC CX;(5)判断计数器是否为0,若不为0,则执行第3步;若为0,则跳转到计算结果的部分。

五、实验结果(1)使用循环指令实现计算1~10的和MOV CX,10MOV AX,0LOOP label1ADD AX,CXDEC CXJNZ label1label1:MOV sum,AX(2)使用循环结构实现计算1~10的和MOV CX,10MOV AX,0label2:ADD AX,CXDEC CXJNZ label2MOV sum,AX六、实验总结本次实验实现了两种不同的循环方式,分别使用了循环指令和循环结构。

汇编语言实验报告

汇编语言实验报告

合肥工业大学实验报告课程:汇编语言程序设计专业班级:学号:姓名:实验一Debug程序的使用一. 实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。

2、掌握8086/8088的寻址方式及多字节数据的处理方法。

二. 实验内容1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。

2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。

要求:本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。

三. 实验过程和程序基础题:1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。

2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。

附加题:1. 从DS:0000H开始的5个16位带符号数分别记为x,y,z,v,w,用E命令初始化为:540,1,-1,1080,0, 试求w=(v-(x*y+z-540))/x2. 完成BX中1的个数的统计。

3. 用串操作指令将DS:0000开始20个字节初始化为:0CCH。

并将这20个字节的内容复制到其后的20个字节里。

四. 实验结果(包括必要的截图)基础题 1:基础题 2:附加题 1:附加题 2:附加题 3:五. 实验体会1. 在汇编语言中,变量的其实都是地址。

2. 在Debug中,数值都是16进制的。

3. 在读写内存中的数据时,必须指出数据类型是byte还是word。

汇编实验2讲解

汇编实验2讲解

实验二循环与子程序程序设计一、实验目的1) 加深对循环结构的理解。

2)掌握循环程序的设计方法。

3)学习子程序的定义和调用方法。

4)掌握子程序、子程序的嵌套、递归子程序的结构。

5) 掌握子程序设计、编制及调试。

6) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。

二、实验内容1) 编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。

2)将从3000H内存单元开始的100个字节存储单元全部清0。

3)编制在屏幕上显示九九乘法表的程序。

4)编制在屏幕上显示用*组成的三角形的程序。

5)设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。

6)编写一个递归子程序,计算指数函数X n的值,其中X,n从键盘输入。

三、实验设备PC机一台四、实验步骤1) 按程序流程图编制实验程序。

2) 输入源程序。

3) 汇编、连接程序,执行程序,检查结果。

4)对内存单元3000H开始的100个存储单元用E命令输入任意数。

5) 程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。

6) 用D命令检查执行结果。

五、实验报告的要求1)列出源程序。

2)对程序中用到的寄存器说明其功能。

3)总结计数控制循环程序的设计方法。

4) 说明怎样使用DEBUG进行程序调试的。

调试过程中所遇到的问题是如何解决的。

实验2-1源程序:DATA SEGMENTBUF DB '1+2*3+3*4+4*5+...+N(N+1)=$'DATA ENDSSTACK1 SEGMENT PARA STACKDW 20H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV DX,01HMOV BX,01HL1:INC BXMOV AX,BXINC AXMUL BL;(进行乘法运算,bl作为乘数)ADD DX,AX;(DX作为累加变量)CMP AX,200;N(N+1)是否大于200JBE L1MOV BX,DXLEA DX,BUFMOV AH,09HINT 21H;输出字符串MOV CX,4LOP:MOV AX,4MOV DX,BXMUL CLSUB AX,4MOV AH,ALMOV AL,CLMOV CL,AH;SHR DX,CL;cl作为移位位数寄存器AND DX,0FHCMP DX,0AHJBE L2ADD DX,7HL2:ADD DX,30HMOV CL,AL;MOV AH,02HINT 21HLOOP LOP;输出数据MOV AH,4CHINT 21HCODE ENDSEND START运行结果:实验2-2源程序:stack1 segment para stackdw 20h dup(0)stack1 endscode segmentassume cs:code,ss:stack1 start:mov ax,300hmov ds,axmov cx,100;cx作为循环变量lop:mov bx,cx ;bx作为地址偏移mov al,0h ;al为0,目的是清零mov -1[bx],alloop lopmov ah,4chint 21hcode endsend start运行结果:实验2-3源程序:data segmentBUF DB 09H,09Hdata endsstack1 segment para stackdw 20h dup(0)stack1 endsCODE SEGMENTassume cs:code,ds:data,ss:stack1,es:data START:MOV AX,DATAMOV DS,AXAND CX,0000HMOV CL,09H;;cl作为循环变量L1:MOV BUF,CLMOV CL,09HL2:MOV BUF+1,CLMOV AL,10SUB AL,BUFMOV DL,ALOR DL,30HMOV AH,02HINT 21HMOV DL,'*'MOV AH,02HINT 21HMOV BL,10SUB BL,BUF+1MOV DL,BLOR DL,30HINT 21HMOV DL,'='INT 21H;会运行一段小程序,使AX的值改变AND AX,0000HMOV AL,10SUB AL,BUFMOV DL,ALMUL BLMOV BL,10DIV BLMOV DL,ALMOV DH,AHOR DL,30HMOV AH,02HINT 21HMOV DL,DHOR DL,30HMOV AH,02HINT 21HMOV DL,' 'INT 21HMOV CL,BUF+1LOOP L2INT 21HMOV CL,BUFLOOP L1MOV AH,4CHINT 21HCODE ENDSEND START运行结果:实验2-4源程序:data segmentM DB 20HLS DB 00HLP DB 00Hdata endsstack1 segment para stack dw 20h dup(0)stack1 endsCODE SEGMENTassume cs:code,ds:data,ss:stack1,es:data START:MOV AX,DATAMOV DS,AXMOV AL,03HMOV AH,00HINT 10HMOV CX,5L1:MOV LP,CLMOV BX,6HSUB BX,CXMOV LS,BLMOV BH,00HMOV DH,LSMOV AL,MAND AH,00HSUB AL,LSMOV DL,ALMOV AH,02HINT 10HMOV AL,LSAND AH,00HMOV BX,2MOV AL,LSMUL BLSUB AL,1MOV LS,ALMOV AH,9HMOV AL,'*'MOV BH,0MOV BL,0DHMOV CL,LSAND CH,00HINT 10HMOV CL,LPAND CH,00HLOOP L1MOV AH,4CHINT 21H CODE ENDS END START运行结果:实验2-5源程序:STACK SEGMENT STACK DW 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK START:MOV AH,01HINT 21HAND BX,0000HSUB AL,30HMOV BL,ALMOV AH,01HINT 21HSUB AL,30HAND CX,0000HMOV CL,ALMOV AX,01HAND DX,0000HCALL MPUSH AXMOV BX,DXCALL SHOWPOP AXMOV BX,AXCALL SHOWMOV AH,4CHINT 21HM PROCSUB CX,1HJBE LCALL ML:PUSH DXMUL BXMOV CX,AXPOP AXPUSH DXMUL BXPOP DXADD DX,AXMOV AX,CXRETM ENDP SHOW PROCMOV CX,4L2:PUSH CXMOV CL,4ROL BX,CLMOV DL,BLAND DL,0FHCMP DL,0AHJB L3ADD DL,07H L3:ADD DL,30HMOV AH,02HINT 21HPOP CXLOOP L2RETSHOW ENDP CODE ENDSEND START运行结果:实验2-6源程序:STACK SEGMENT STACK DW 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK START:MOV AH,01HINT 21HAND BX,0000HSUB AL,30HMOV BL,ALMOV AH,01HINT 21HSUB AL,30HAND CX,0000HMOV CL,ALMOV AX,01HAND DX,0000HCALL MPUSH AXMOV BX,DXCALL SHOWPOP AXMOV BX,AXMOV AH,4CHINT 21HM PROCSUB CX,1HJBE LCALL ML:PUSH DXMUL BXMOV CX,AXPOP AXPUSH DXMUL BXPOP DXADD DX,AXMOV AX,CXRETM ENDP SHOW PROCMOV CX,4L2:PUSH CXMOV CL,4ROL BX,CLMOV DL,BLCMP DL,0AHJB L3ADD DL,07H L3:ADD DL,30HMOV AH,02HINT 21HPOP CXLOOP L2RETSHOW ENDP CODE ENDSEND START运行结果:。

北京理工大学汇编实验二报告

北京理工大学汇编实验二报告

北京理工大学汇编实验二报告本科实验报告实验名称:算术运算类操作实验课程名称:CPU与汇编实验实验时间:2015.10.29 任课教师:王耀威实验地点:10-102实验教师:潘丽敏实验类型:□原理验证■综合设计□自主创新学生姓名:王晓玥学号/班级:1120131332/05111311 组号:学院:信息与电子学院同组搭档:专业:信息工程成绩:一、实验要求和目的1、了解汇编语言中的二进制、十六进制、十进制、BCD 码的表示形式;2、掌握各类运算类指令对各状态标志位的影响及测试方法;3、熟悉汇编语言二进制多字节加减法基本指令的使用方法;4、熟悉无符号数和有符号数乘法和除法指令的使用;5、掌握符号位扩展指令的使用。

6、掌握 BCD 码调整指令的使用方法二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有 MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识1、加减法处理指令主要有加法指令 ADD,带进位加法 ADC,减法指令 SUB,带进位减法指令 SBB。

2.乘除法指令和符号位扩展指令主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令 IDIV,以及符号位从字节扩展到字的指令 CBW 和从字扩展到双字的指令 CWD。

3.BCD 码的调整指令主要有非压缩的BCD 码加法调整指令DAA,压缩的 BCD 码减法调整指令 DAS,非压缩的 BCD 码加法调整指令 AAA,非压缩的 BCD 码减法调整指令 AAS,乘法的非压缩 BCD码调整指令 AAM,除法的非压缩 BCD 码调整指令 AAD。

8088/8086 指令系统提供了实现加、减、乘、除运算的上述基本指令,可对表 1 所示的数据类型进行数据运算。

表 1-2-1 数据类型数据运算表数制二进制BCD码带符号无符号组合非组合运算符+、-、×、÷+、-+、-、×、÷操作数字节、字、多精度字节(二位数字)字节(一位数字)四、实验内容与步骤1、对于两组无符号数,087H 和 034H,0C2H 和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响:(1)实验流程将一组操作数分别用ADD,SUB,MUL,DIV运算(2)实验代码:DATAS SEGMENTBUF1 DB 087HBUF2 DB 034HBUF3 DB 4 DUP(?);此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AX,0MOV SI,AX;两数相加MOV AL,BUF1MOV BL,BUF2ADD AL,BLMOV BUF3[SI],ALMOV AL,0MOV AL,0INC SIMOV BUF3[SI],AL;两数相减MOV AL,BUF1MOV BL,BUF2SUB AL,BLINC SIMOV BUF3[SI],ALMOV AL,0SBB AL,0INC SIMOV BUF3[SI],AL;两数相乘MOV AL,BUF1MOV BL,BUF2MUL BLINC SIMOV BUF3[SI],ALINC SIMOV BUF3[SI],AH;两数相除,AL中存放商,AH中存放余数MOV AX,0MOV AL,BUF1MOV BL,BUF2DIV BLINC SIMOV BUF3[SI],ALINC SIMOV BUF3[SI],AH;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START(3)实验结果:1)第一组操作数87H,34H2)第二组操作数0C2H,5FH(4)计算结果计算状态标志表达式结果CF AF ZF OF SF PF 087H+034H 00BB 0 0 0 0 1 1 087H-034H 0053 0 0 0 1 0 1 087H*034H 1B6C 1 0 0 1 0 0 087H/084H 02(1F) 1 0 0 0 0 1 0C2H+05FH 0121 0 0 0 0 0 0 0C2H-O5FH 0063 0 0 1 0 0 1 0C2H*05FH 47FE 0 0 0 0 0 1 0C2H/05FH 02(04) 0 0 0 0 0 0(5)各运算对状态标志位的影响及其意义。

汇编语言实验2报告

汇编语言实验2报告
汇编语言实验2
汇编语言程序设计实验
2.实验过程
一.实验目的与要求1.学习并掌握汇编语言程 Nhomakorabea的基本设计
2.编程掌握汇编语言编程的顺序结构,选择结构,循环结构
二.实验设备
微型计算机
三.实验内容
1.编程实现9+8-7运算,把结果存在存储单元中。用debug查看程序的运行结果,检查程序运行结果的正确性,源程序命名为1.asm。(可使用masm5.0也可使用集成汇编环境)(如使用masm5.0需要将1.asm放入到masm5.0文件夹下,接下来进行汇编和链接,如果使用集成开发环境需要将源文件1.asm和生成的1.obj和1.exe存放到以班级学号姓名命名的文件夹下)
可使用masm50也可使用集成汇编环境如使用masm50需要将1asm放入到masm50文件夹下接下来进行汇编和链接如果使用集成开发环境需要将源文件1asm和生成的1obj和1exe存放到以班级学号姓名命名的文件夹下源程序及注释如下
实验报告
系别
班级
学号
姓名
时间
地点
机电系
课程名称
微机原理及接口技术
实验名称
源程序及注释如下:
debug查看结果如下:
2.试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来,源程序命名为2.asm。(提示:输入和显示调用dos功能实现,要求使用文件夹中的集成汇编环境,源文件及生成文件存放到以班级学号姓名命名的文件夹下)
源代码及注释如下:
键盘输入小写字母并用大写字母显示截图如下:
3.试编写一个汇编语言程序求1+2+3+……..+10,并在屏幕上显示最终的和值,源程序命名为3.asm。(提示:显示调用dos功能实现,要求使用文件夹中的集成汇编环境,源文件及生成文件存放到以班级学号姓名命名的文件夹下)

昆明理工大学 汇编 实验二

昆明理工大学 汇编 实验二

昆明理工大学信息工程与自动化学院学生实验报告(2014 —2015 学年第一学期)课程名称:汇编与微机接口开课实验室:信自楼机房444 2014年12月3日一、实验目的1、熟悉并掌握汇编语言的基本指令;2、熟练地掌握子程序的设计过程;3、熟悉并掌握BIOS和DOS中断的调用方法;4、熟悉主程序调用子程序的模块化程序设计思想,即将原始数据通过转换为内存数据再转化为显存数据显示到屏幕上。

二、实验要求将实验7中的Power idea公司的数据按照图所示的格式在屏幕上显示出来。

(用子程序编写代码以十进制方式显示内存中的数据。

)三、实验分析完成这个实验需要编写以下几个子程序:(1)名称:show_str功能:在指定的位置,用指定的颜色,显示一个以0结尾的字符串;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)(cl)=颜色,ds:si指向字符串的首地址。

(2)名称:divdw功能:进行无溢出的除法操作,被除数为被除数为dword型,除数为word 型,结果为word型;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数。

(3)名称:dtoc功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符;参数:(ax)=word型数据,ds:si指向字符串的首地址。

四、实验环境汇编程序:MASM.EXE,链接程序:LINK.EXE,调试环境:DEBUG.EXE,对操作系统和计算机五特殊要求,如果是WIN7以上操作系统,需要安装DOSBOX虚拟平台。

五、实验过程与结果assume cs:code,ds:data,es:table ;将代码段的段地址给cs,将数据段的段地址给ds,将table段的段地址给estable segment ;定义table段db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991','1992' db '1993','1994','1995';表示21年的21个字符串,每个年份占四个字节,共占84字节dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000 ;表示21年公司总收入的21个双字型数据,共占84字节dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;表示21年公司雇员人数的21个字型数据,共占42字节dw5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239dw 260,304,333;表示21年公司雇员人均年收入的21个字型数据,共占42字节table ends ;table 段结束data segment ;定义data段db 32 dup (0) ;预留出32字节的空间data ends ;data 段结束code segment ;code段start:;将data段、table段的段地址通过中间寄存器赋给ds 、es mov ax, datamov ds, axmov ax, tablemov es, axmov bx, 0 ;table段指针清0mov si, 0 ;data段指针清0mov di, 0 ;table段指针清0mov cx, 21 ;循环次数给cxmov dh, 2 ;将行号给dhmov dl, 30 ;列号给dls1: push cx ;将寄存器进栈保护,防止将其中数据覆盖push dx;取年份,一个年份分两次取mov ax, es:[bx] ;将table段的值取给ax,一次取两个字节即字符“19”mov [si], ax ;将ax的值写入内存mov ax, es:[bx+2] ;取年份的后两个字符,如“75”mov [si+2], ax ;写到内存的相应位置;取公司总收入mov ax, es:[bx+84] ;table段中字型数据占84个字节,取年总收入指针加84mov dx, es:[bx+86]add si, 6 ;数据段指针加6:总收入加上空格call dtoc ;调用子程序dtocmov ax, es:[di+168] ;取公司雇员数mov dx, 0 ;dx清0add si, 10 ;数据段指针指向相应位置call dtoc ;调用子程序,将data段的数据以十进制形式显示mov ax, es:[di+210] ;取人均年收入:84+84+42=210mov dx, 0 ;dx清0add si, 8 ;数据段指针指向相应位置call dtoc ;调用子程序,将data段的数据以十进制形式显示mov si, 0 ;指针清0mov cx, 21 ;循环次数s2: push cx ;cx进栈保护mov cl, [si] ;将数据段的字符取给cljcxz s4 ;若cx=0,则执行标号s4处的代码s3: inc si ;指针加1pop cx ;cx的值出栈loop s2 ;循环标号s2处的代码,直至cx=0inc si ;指针加1mov al, 0 ;将al清0mov [si], al ;将al的值传到数据段mov si, 0 ;指针清0pop dx ;dx的值出栈mov cl, 2 ;将颜色传给clcall show_str ;调用子程序add bx, 4 ;指针加4add di, 2 ;指针加2,指向下一个数据add dh, 1 ;行号加1,指向下一个数据pop cx ;cx的值出栈loop s1 ;循环执行s1处的代码,直至cx=0mov ax, 4c00hint 21hs4: mov al, 20hmov [si], aljmp s3;进栈保护,防止数据在子程序中被覆盖dtoc:push axpush cxpush dxpush sipush dimov di, 0 ;保存字符进栈的个数d1: mov cx, 10 ;将除数10给cxcall divdw ;调用子程序,进行不会溢出的除法运算add cx, 30h ;cx中存放的是余数,将余数加上30h得到该数字的ASCII 码push cx ;将cx进栈保护inc di ;字符个数加一mov cx, ax ;将ax里的商给cxjcxz d2 ;若cx为0,则执行d2jmp d1 ;否则跳转到d1d2: mov cx, dx ;将做除法的高十六位的商给cxjcxz d3 ;若cx=0,则执行标号d3处的代码jmp d1 ;若cx=0不成立,则执行d1处的代码d3: mov cx, di ;将进栈字符个数传给cx,作为循环次数d4: pop ax ;将字符出栈mov [si], al ;将字符的ASCII码写入数据段inc si ;指针加1loop d4 ;循环执行标号d4处的代码;循环结束后,寄存器逆序出栈pop dipop sipop dxpop cxpop axRet ;子程序结束divdw: ;子程序,做无溢出的除法操作;si,ax进栈保护push sipush axmov ax, dx ;将被除数的高十六位给axmov dx, 0 ;高位清0div cx ;做除法操作,商在ax中,余数在dx中 mov si, ax ;将高位商给sipop ax ;被除数的低十六位出栈div cx ;做除法操作,商在ax中,余数在dx中 mov cx, dx ;将余数给cxmov dx, si ;将高位的商给dxpop si ;si出栈Retshow_str:;寄存器进栈保护push axpush espush bxpush simov ax, 0b800h ;将显存缓冲区的地址给axmov es, ax ;ax将值赋给段寄存器;计算显示的位置mov al, 160 ;每行有160个字节mul dh ;做乘法操作,结果放在ax中mov bx, ax ;将结果给bx,后面要用到axmov al, 2 ;每个字符在显存中占两个字节mul dl ;将al里的值与dl里的相乘,结果默认放在ax 里add bx, ax ;计算相应位置,160*2+30*2mov al, cl ;将颜色传给almov cl, 0 ;准备cxshow1:mov ch, [si] ;将数据段的值取给chjcxz show2 ;cx=0则执行show2mov es:[bx], ch ;将ch中数据段的值显示在屏幕上mov es:[bx+1], al ;将字符以该颜色显示inc si ;指针加1,指向下一个add bx, 2 ;指针加2jmp show1 ;直接跳转到show1;寄存器逆序出栈show2: pop sipop bxpop espop axRet ;子程序结束code endsend start六、实验总结要学好汇编语言,实验是必不可少的环节。

汇编语言实验二查找匹配字符串

汇编语言实验二查找匹配字符串

汇编语言实验二查找匹配字符串一、目的查找匹配字符串SEARCH二、实验内容程序接收用户键入的一个关键字以及一个句子。

如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

流程图N YY Y输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符)YN bx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1 cx 是否为0N 匹配完成,调用子程序输出al 是否为0 不匹配,输出三、设计和编码DATA SEGMENTmess1 DB'Enter keyword:','$'mess2 DB'Enter Sentence:','$'mess3 DB'Match at location:','$' mess4 DB'NOT MATCH.',13,10,'$' mess5 DB'H if the sentence',13,10,'$'change DB 13,10,'$'stoknin1 label bytemax1 db 10act1 db?stokn1 db 10 dup(?)stoknin2 label bytemax2 db 50act2 db?stokn2 db 50 dup(?)DATA ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENT;*************************************代码段main proc farassume cs:code,ds:data,es:dataSTART:push dssub AX,AXsub BX,BXsub DI,DIsub SI,SIpush AX ;为返回dos并清空后面要用到的寄存器MOV AX,DATAMOV DS,AXLEA DX,mess1MOV ah,09INT 21h ;输出Enter keywordLEA DX,stoknin1MOV ah,0ah ;用21号中段的0ah号功能获取关键字INT 21hcmp act1,0je exit ;如果为空直接退出程序a10:;********************************输入Sentence并判断LEA DX,changeMOV ah,09INT 21h ;输出回程,换行LEA DX,mess2MOV ah,09INT 21h ;输出Enter Sentence:LEA DX,stoknin2MOV ah,0ahINT 21h ;用21号中段的0ah号功能获取句子MOV AL,act1CBWMOV CX,AX ;保存关键字长度到cxPUSH CX ;cx入栈MOV AL,act2cmp AL,0je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1js a50 ;若句子长度小于关键字长度,则跳转显示not match INC ALCBWLEA BX,stokn2 ;将句子的首地址放进BXMOV DI,0MOV SI,0a20:;****************************************比较,内循环MOV AH,[BX+DI]CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30jne a30INC DIINC SIDEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMP CX,0je a40jmp a20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INC BXDEC ALcmp AL,0je a50MOV DI,0MOV SI,0POP CXpush CXjmp a20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUB BX,offset stokn2INC BXLEA DX,changeMOV ah,09INT 21hLEA DX,mess3MOV ah,09INT 21hCALL btohLEA DX,mess5MOV ah,09INT 21hjmp a10;****************************************二进制转换十六进制btoh PROC NEARMOV CH,4rotate: MOV CL,4ROL BX,CLMOV AL,BLand AL,0fhadd AL,30hcmp al,3ahjl printitadd al,7hprintit:MOV dl,alMOV ah,2int 21hdec chjnz rotateretbtoh endpa50:;*****************************************显示not matchLEA DX,changeMOV ah,09INT 21hLEA DX,mess4MOV ah,09INT 21hjmp a10exit:retmain endpCODE ENDSEND START 四、运行结果及分析五、实验小结六、附录(选)。

汇编语言程序设计实验二及答案

汇编语言程序设计实验二及答案

实验二:汇编语程序设计一、实验目的旨在通过实验使同学了解汇编语言的程序结构和编程方法,可以编写出顺序程序、分支程序和一般的循环程序,并学会修改和调试方法。

二、实验环境MASM、LINK、DEBUG或包含此软件的相关软件三、实验内容1.1、从FIRST开始的100个单元中存放着一个字符串,结束符为$。

编写一个程序,统计该字符串中字母‘A’的个数。

DATA SEGMENTFIRST DB 'AGHI K…$’ ;定义字符串,结束符为$NUMBER DB ? ;结果存放单元DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX,DATA ;建立数据段的可寻址性MOV DS, AXMOV BL,0 ;BL用作统计计数器LEA DI,FIRST ;取字符串首址NEXT: MOV AL, [ DI] ;取一个字符INC DI ;指向下一个字符CMP AL,’$’ ;与结束符’$’比较JE EXIT ;等于,搜索完结束CMP AL , 'A ;与字符‘A’比较JNE NEXT ;不等于。

不统计INC BL ;找到,计数IMP NEXT ;继续EXIT: MOV NUMBER,BLMOV AH,4CHINT 21HCODE ENDSEND START2.编程判断输入的ASCII码字符时数字还是字母,并将判断结果分别以“D”和“L”显示出来。

解:用宏实现字符显示。

程序如下:DISPLAY MACRD CHAR;显示字符宏定义MOV DL,CHARMOV AH,02HINT 21HENDMCODE SEGMENTASSUME CS: CODESTART : MOV AH, 0lH ;输人一个ASCI I码字符INT 21 HCMP AL, '0’JC ERROR ;非数字和字母,转ERROR处理CMP AL, '9'JA NEXT ;非数字,转NERTDISPLAY 'D' ;数字。

汇编语言程序设计实验报告二

汇编语言程序设计实验报告二

汇编语言程序设计实验报告(二)一、实验目的1)加深对循环结构的理解。

2)掌握循环程序的设计方法。

3)学习子程序的定义和调用方法。

4)掌握子程序、子程序的嵌套、递归子程序的结构。

5)掌握子程序设计、编制及调试。

6)熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。

二、实验内容1)编制在屏幕上显示九九乘法表的程序。

2)编制在屏幕上显示用*组成的三角形的程序。

三、实验结果(1)(2)四、源代码(1)DA TA SEGMENTM DB 31H,32H,33H,34H,35H,36H,37H,38H,39H DA TA ENDSSTACK1 SEGMENT STACKDW 20H DUP(?)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,SS:STACK1 START:MOV AX,DA TAMOV DS,AXMOV CX,9MOV DI,OFFSET MLOP1:PUSH CXMOV CX,[DI]AND CX,0FHMOV SI,OFFSET M LOP2:MOV AL,[SI]MOV DL,ALMOV AH,2INT 21HAND AL,0FHMOV BH,ALMOV DL,'*'MOV AH,2INT 21HMOV BL,[DI]MOV DL,BLMOV AH,2INT 21HMOV DL,'='MOV AH,2INT 21HAND BL,0FHMOV AL,BHMOV AH,0MOV DL,10DIV DLMOV BL,AHCMP AL,0JE NEXTMOV DL,ALADD DL,30HMOV AH,2INT 21H NEXT:MOV DL,BLADD DL,30HMOV AH,2INT 21HMOV DL,' 'MOV AH,2INT 21HINC SILOOP LOP2MOV DL,0AHMOV AH,2MOV DL,0DHINT 21HINC DIPOP CXLOOP LOP1MOV AH,4CHINT 21HCODE ENDSEND START(2)STACK1 SEGMENT STACKDW 20H DUP(?)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK1 BEGIN:MOV AH,1INT 21HMOV BL,ALSUB BL,30HMOV DL,0AHINT 21HMOV DL,0DHMOV AH,2INT 21HMOV BH,0MOV CX,BXMOV BX,1L1: PUSH CXMOV CX,BX L2: MOV DL,'*'MOV AH,2INT 21HLOOP L2MOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HADD BX,1POP CXMOV AH,4CHINT 21HCODE ENDSEND BEGIN五、实验心得这是第二次做汇编实验,首先,心理上已经没有了第一次做实验的那种茫然,知道了想要编写一个完整的程序,应当先将这一个大问题分解成若干个小的问题,找出每一个小问题所对应的解决方法,然后用代码一步一步实现,再将这一个一个的小问题串联起来,找到它们的契合点,用联系把它们组成一个完整的程序,其中最常用的就是转移指令和循环。

汇编语言程序设计2

汇编语言程序设计2

目录系统认识 (1)实验一数码转换编程及程序调试 (5)实验二运算类编程实验 (11)实验三分支程序、循环程序设计实验 (16)实验四子程序设计实验 (22)实验五显示程序实验 (26)实验六串行通讯应用实验 (27)附录WMD86 联机软件使用说明 (40)系统认识一、实验目的掌握TD-PITE微机原理与接口技术教学实验系统的操作,熟悉Wmd86联机集成开发调试软件的操作环境。

二、实验设备PC微机一台,TD-PITE实验装置一套。

三、实验内容编写实验程序,将00H~0FH共16个数写入内存3000H开始的连续16个存储单元中。

四、实验步骤1. 运行Wmd86软件,进入Wmd86集成开发环境。

2. 根据程序设计使用语言的不同,通过在“设置”下拉列表来选择需要使用的语言,如图1所示。

语言选择后,下次再启动软件,语言环境保持这次的修改不变。

在这里,我们选择汇编语言。

图13. 语言选择后,点击新建或按Ctrl+N组合键来新建一个文档,如图2所示。

默认文件名为Wmd861。

图24. 编写实验程序,如图3所示,并保存,此时系统会提示输入新的文件名,输完后点击保存。

图3程序:SSTACK SEGMENT STACK ;定义堆栈段DW 32 DUP(?)SSTACK ENDSCODE SEGMENTASSUME CS:CODE, SS:SSTACKSTART: PUSH DSXOR AX, AXMOV DS, AXMOV SI, 3000H ;建立数据起始地址MOV CX, 16 ;循环次数AA1: MOV [SI], ALINC SI ;地址自加1INC AL ;数据自加1LOOP AA1AA2: JMP AA2CODE ENDSEND START5. 点击,编译文件,若程序编译无误,则输出如图4所示的输出信息,然后再点击进行链接,链接无误输出如图5所示的输出信息。

图4图56. 连接PC与实验系统的通讯电缆,打开实验系统电源。

汇编语言实验报告二

汇编语言实验报告二

汇编语言实验报告)(实验二实验二)一.实验目的1.掌握程序设计中的3种基本结构(顺序结构、选择程序、循环程序)。

2.熟练使用汇编语言的指令:数据传送类指令、数据运算类指令、逻辑判断类指令与转移指令、循环指令等。

3.初步了解系统功能调用的使用方法,尝试使用01H号功能调用进行字符输入的方法及使用02H号功能调用进行字符输出(显示)的方法。

二.程序说明1.计算1+2+3+…+10,将结果显示在屏幕上。

2.利用01H号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF的10个字节中,变量BUF的形式为BUF DB 10 DUP(?)。

编程求出这10个数中的最大数和最小数,将最大数存入MAX单元、最小数存入MIN单元,并将其在屏幕上显示出来。

三.设计思想1、先将1-10循环求和,为了将结果显示在屏幕上,需要讲计算后保存在ax中的结果以十进制形式输出,可以将结果的两位数分别存于低位和高位中,即除以10取整和余al是商,ah是余数,后加上30h。

2、使用si寄存器,用于在存储器中寻址。

利用循环输入10个数字,将10个数比较,大的放在al,小的放在bl。

利用01号功能,输出。

四.程序代码程序一code segment main proc far assume cs:code start: push ds sub ax,ax push ax mov bx,0ah mov cx, 0ah sum1: add ax,bx dec bx loop sum1 printit: mov bl,10 div bl add al,30h mov ch,ah mov dl,al mov ah,2 int 21h add ch,30h mov dl,ch mov ah,2 int 21h ret main endp code ends end 程序二程序二data segment ;数据段定义开始数据段定义开始buf db 10 dup(?) ;数据定义及其存储空间数据定义及其存储空间 max db ? min db ? Str1 db 0DH,0AH,'Please input: ','$' ;定义Str1的内容的内容 Str2 db 0DH,0AH,'MAX:','$' ;定义Str2的内容的内容 Str3 db 0DH,0AH,'MIN:','$' ;定义Str3的内容的内容 data ends ;数据段定义结束数据段定义结束Stack segment stack ;堆栈段定义开始堆栈段定义开始db 10 dup(?) stack ends ;堆栈段定义结束堆栈段定义结束code segment ;代码段定义开始代码段定义开始main proc far assume cs:code,ds:data,ss:stack start: push ds sub ax,ax push ax mov ax,data mov ds,ax mov ax,stack mov ss,ax mov cx,10 mov si,0 ;寄存器,用于寻址寄存器,用于寻址mov bx,0 lop1: lea dx,Str1 mov ah,09 int 21h mov ah,01h ; 输入输入int 21h mov buf[si],al inc si loop lop1 ;返回循环1 mov cx,9 mov si,0 mov al,buf[si] mov bl,al lop2: inc si mov dl,buf[si] cmp dl,al jl compare1 mov al,dl compare1: cmp bl,dl ;比较,小的数放在bl jl compare2 mov bl,dl compare2: loop lop2 mov max,al mov min,bl lea dx,Str2 mov ah,09 int 21h mov dl,max mov ah,02h int 21h ;输出最大数输出最大数lea dx,Str3 mov ah,09 int 21h mov dl,min mov ah,02h int 21h ;输出最小数输出最小数ret main endp code ends end start 五. 结果分析并回答: 1. 设计的程序包含了几个段设计的程序包含了几个段 2. 你的代码经过编译和连接之后,总共占用多少个字节你的代码经过编译和连接之后,总共占用多少个字节3. 调用DEBUG 进行反汇编,查看程序的第一条指令的地址码是多少?最后一条指令的地址码是多少?指令的地址码是多少?4. 对于第2题,怎样修改程序可以同时实现将10个数字的累加功能个数字的累加功能5.对于第2题,若要求输入的是两位数,又该怎么办?题,若要求输入的是两位数,又该怎么办? 程序一:运行结果运行结果1、本程序包含了一个段,即为代码段、本程序包含了一个段,即为代码段2、代码经过编译和连接之后,共占32个字节个字节3、第一条指令的地址码、第一条指令的地址码最后一条指令的地址码最后一条指令的地址码程序二运行结果运行结果1、本程序包含了数据段、堆栈段和代码段三个段。

实验二 汇编语言程序上机过程及调试

实验二    汇编语言程序上机过程及调试

实验报告二课程微机原理实验名称汇编语言程序上机过程以及调试第页专业电子信息班级__ __ 学号_ __ 姓名实验日期:2014 年 3 月10 日报告退发(订正、重做)一、实验目的学习汇编语言程序设计的基本步骤,即编辑(EDIT)程序、汇编(MASM)、连接(LINK)和运行,使对汇编语言程序设计有一个初步的认识。

二、实验内容1、学习使用全屏幕文本编辑软件EDIT。

用EDIT输入一段给定的源程序。

2、用MASM对已存盘的源程序进行汇编,形成目标文件(.OBJ);如有错误,再返回到EDIT进行修改。

3、用LINK对上述形成的目标文件进行连接,形成可执行文件(.EXE)4、在DOS提示符下运行该可执行文件。

[汇编语言程序的编写格式]汇编语言程序一般由几个段组成,它们分别是堆栈段,数据段,代码段。

任何一个源程序至少必须有一个代码段和一条作为源程序结束的伪指令END。

段的定义有两种格式,分述如下:1,完整的段定义格式:一个段由段头,段体,段尾组成,形式如下:段名SEGMENT[定位类型][组合类型][‘类别’]……段名ENDS其中SEGMENT后的参数一般可省略,详细说明参阅后面的有关章节。

2,简化的段定义格式(MASM5.0版本提供)每段以.开始后跟固定的段名,一般形式如下:DOSSEG.MODEL 存储类型;“存储类型”可选择为SMALL。

.STACK[大小];堆栈段,“大小”指定堆栈的字节数。

.DATA;数据段。

.CODE[名字];代码段;一般只有一个代码段,名字可缺少……例1:用完整的段定义编写一源程序。

NAME EXAM1;可以省略DATA SEGMENT;定义数据段,以下是数据段的内容STR1 DB “HELLO,WELCOME!”,13,10,‘$’STR2 DB “DO YOU LIKE COMPUTER?(Y/N)”,13 10,‘$’STR3 DB “NICE!”,13,10,‘$’STR4 DB “SORRY!”,13,10,‘$’STR5 DB “UNKNOW,ANSWER AGAIN!(Y/N)”,DB 13,10,‘$’STR6 DB “SEE YOU NEXT TIME!”,13,10,‘$’DA TA ENDS ;数据段结束CODE SEGMENT ;定义代码段ASSUME CS:CODE;DS:DATA;以下是代码段内容START:MOV AX,DA TA;给数据段寄存器赋值MOV DS,AXMOV AH,9;显示一字符串的功能号MOV DX,OFFSET STR1;显示字符串STR1的偏址INT 21H;DOS功能调用ASK :MOV DX,OFFFSET STR2;显示字符串STR2INT 21HMOV AH,1;键盘输入一字符的功能号INT 21H;键入的字符ASCⅡ码在ALNOT AL;求反TEST AL,‘Y’;是否按下‘Y’或‘y’键JE NEXT1TEST AL,‘y’JE NEXT1TEST AL,‘N’;是否按下‘N’键或‘y’键JE NEXT2TEST AL, ‘n’JE NEXT2MOV DX,OFFSET STR5;不是按上述键MOV AH,9INT 21HJMP ASK;再返回ASKNEXT1:MOV DX,OFFSET STR3;是按下‘Y’或‘y’键MOV AH,9INT 21HJMP BYENEXT2:MOV DX,OFFSET STR4;是按下‘N’或‘n’键MOV AH,9INT 21HBYE:MOV DX,OFFSET STR6INT 21HMOV DL,7;喇叭响的ASCⅡ码MOV AH,2INT 21HMOV AH,4CH;退回DOSINT 21HCODE ENDS;代码段结束END START;源程序结束注:源程序中的每一行注释语句前一定要加分号‘;’,下同。

sy22

sy22

; 数据段 数据段1 ; 定义源串 ;数据段 数据段2 数据段 ; 定义目的缓冲区 ;代码段 代码段 ;指示指令中标号 变量所在段 指示指令中标号,变量所在段 指示指令中标号 ;设置传送方向 设置传送方向 ;DS: SI ← 源串首地址 :
;ES:DI ← 目的首地址 :
;CX ← 串的长度 ;串传送 串传送 ;调用 调用4CH系统功能 返回 系统功能,返回 调用 系统功能 返回DOS
; 执行程序 -G Program terminated normally ; 查看目的串 -D 129E: 0 L20 129E:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129E:0010 FC B8 9D 12 8E D8 8D 36-00 00 B8 9E 12 8E C0 BF .......6........ ; 从源串重新查看 -D 129D: 0 L50 129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129D:0010 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... 129D:0020 FC B8 9D 12 8E D8 8D 36-00 00 B8 9E 12 8E C0 BF .......6........ 129D:0030 00 00 B9 06 00 F3 A4 B4-4C CD 21 09 E8 08 00 03 ........L.!..... 129D:0040 F1 E8 03 00 3C 0D C3 AC-E8 EC F8 75 04 3C 3B 75 ....<......u.<;u -

汇编语言实验2

汇编语言实验2
3.请使用D命令查看段地址为2000:100开始的存储单元内容,命令与结果显示在下方。
思考与练习
1.数据的寻址方式在debug方式下有哪几个是可以直接使用的?
2.BX和BP都是基址寄存器,使用时有区别吗?如果有,是什么?
老师评价
指导老师签名:
(3)使用debug调试掌握数据的寻址方式。
实验任务
1.请进入debug中,将数据段寄存器设置为2000H,并将使用的命令及查看的结果写出来。
实验步骤
2.请使用MOV命令和要求的寻址方式将下列的存储单元或寄存器写入对的数据。请将使用的命令和执行的结果显示在下方。
(1)将数据ABCDH写入AX寄存器,采用立即寻址方式。
(2)将寄存器AX中的数据送入到BX寄存器中,采用寄存器寻址方式。
(3)将数据789AH存入20100H存储单元,使用寄存器间接寻址方式。
(4)将数据1378H存入20102H存储单元,使用寄存器相对寻址方式。
(5)将数据9867H存入20104H存储单元,使用基址变址寻址方式。
(6)将数据7F10H存入20106H存储单元,使用相对基址变址寻址方式。
实验二《指令寻址方式的使用》实验报告
实验名称
指令寻址方式的使用
实验
时间
年月日
节课
实验
时数
2
实验学生
指导教师
实验场地
实验准备
(1)操作系统: Windows 2000 /windowsxp
(2)汇编软件:MASM
实验目的
(1)了解汇编语言调试程序使用的基本过程。
(2)掌握使用debug命令中常用的命令。

实验二 汇编语言程序设计实验

实验二 汇编语言程序设计实验

实验二汇编语言程序设计实验一、实验目的:1)熟悉常用的汇编语言指令2)掌握程序的顺序结构、分支结构、循环结构和子程序结构3)掌握汇编语言程序调试方法二实验内容:(一)顺序结构(以下程序至少完成一个)(1)编制计算下列表达式的程序:w=x/2-y+4*z(其中x,y,z均为带符号字节类型的数);(2)编写程序完成两个已知双精度数(4字节)A和B相加并将结果存入双精度变量单元SUM 中(不考虑溢出);(3)从键盘输入一个小写字母,将其转化为大写字母显示出来。

(二)分支结构(以下程序至少完成一个)(1)设平面上一点P的直角坐标为(X,Y),X,Y为字类型符号数,试编制若P落在第i象限内,则令k=i;若P落在坐标轴,则令k=0的程序;(2)编写一程序,把变量BUFX和BUFY中较大者存入BUFZ中,若两者相等,则把其中之一存入BUFZ中。

假设变量存放的是8位无符号数;(3)设变量BUFX为16位带符号数,将其符号状态保存在SIGNX,即如果BUGFX大于等于0,保存0;如果小于0,则保存-1。

(4)BUFX,BUFY和BUFZ是3个有符号十六进制数,编写一个比较相等关系的程序,如果这三个数都不相等,则显示0,如果3个数中有两个相等,则显示1,如果3个数都相等,则显示2.(三)循环结构(以下程序至少完成一个)(1)编程序将符号字数组ARRAYW中的正负数分别送入正数数组PLUS和负数数组MINUS中,同时把0元素的个数送入字变量ZERON;(2)编程序统计16位符号数组ARRAY中的奇数和偶数个数,将奇数个数存入EVENN中,偶数个数存入数组ODDN中。

(3)设有一个数组存放学生的成绩,编写程序统计各分数段学生人数,90-100分人数存入A中,80-89分人数存入B中,70-79分人数存入C中,60-69分人数存入D中,0-59分人数存入E中。

三、撰写实验报告,画出程序流程图,写出源程序,截图给出调试过程和运行结果。

汇编语言实验报告

汇编语言实验报告

xxxxxxx学院计算机工程系《汇编语言》·实验报告
实验一、查看CPU和内存,用机器指令和汇编指令编程2014.09.24实验二、用机器指令和汇编指令编程2014.10.08
实验三、编程、编译、连接、跟踪2014.10.15
实验四、[bx]和loop的使用2014.10.22
实验五、编写、调试具有多个段的程序(一)2014.10.29
实验六、编写、调试具有多个段的程序(二)2014.11.05
实验七、实践课程中的程序2014.11.12
实验八、寻址方式在结构化数据访问中的应用2014.11.19
实验九、分析一个奇怪的程序2014.11.26
实验十、根据材料编程2014.12.3
实验十一、编写子程序2014.12.10
实验十二、综合练习:求无符号字节序列中的最大值和最小值,设有一个字节序列,其存储首地址为3000H,字节数为008H,利用学过的方法编程,求出该序列中的最大值和最小值2014.12.17。

汇编语言实验2

汇编语言实验2

汇编语⾔实验2⼀、实验⽬的1. 理解并掌握汇编源程序组成与结构2. 掌握汇编语⾔源程序编写→汇编→链接→调试的⼯具和⽅法3. 理解汇编源程序中地址表⽰、段寄存器的⽤法4. 理解和掌握寄存器间接寻址⽅式[bx]5. 通过汇编指令loop的使⽤理解编程语⾔中循环的本质⼆、实验准备1. 学习/复习第5章使⽤[bx]和loop实现循环的编程应⽤⽰例(教材5.5节,5.8节)2. 复习第3章「栈」的知识3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运⾏→调试的⽅法4. 复习8086汇编中内存单元地址的表⽰,以及段寄存器DS, SS, ES, CS的⽤途三、实验内容1. 实验任务1 使⽤任意⼀款⽂本编辑器,编写8086汇编源程序ex1.asm。

源代码如下:1;ex1.asm2 assume cs:code3 code segment4mov ax, 0b810h5mov ds, ax6mov byte ptr ds:[0], 17mov byte ptr ds:[1], 18mov byte ptr ds:[2], 29mov byte ptr ds:[3], 210mov byte ptr ds:[4], 311mov byte ptr ds:[5], 312mov byte ptr ds:[6], 413mov byte ptr ds:[7], 414mov ah, 4ch15int 21h16 code ends17 end要求:使⽤8086汇编程序编写、汇编、链接、运⾏、调试⽅法,对ex1.asm进⾏汇编、链接、运⾏,使⽤debug⼯具调试可执⾏⽂件。

使⽤masm、link对ex1.asm进⾏汇编、链接,得到可执⾏⽂件ex1.exe,运⾏并观察结果使⽤debug⼯具对程序进⾏调试使⽤debug加载可执⾏⽂件ex1.exe后,使⽤d命令查看程序段前缀PSP所占的256个字节。

结合可执⾏⽂件中寄存器CX的值,使⽤u命令对ex1.exe进⾏精确反汇编使⽤g命令执⾏到程序退出执⾏之前(即源码⽂件中line16之前),观察结果2. 实验任务2使⽤任意⼀款⽂本编辑器,编写8086汇编源程序ex2.asm。

汇编语言第二章实验报告

汇编语言第二章实验报告

实验二 内存操作数及寻址方法 实验目的: 通过实验掌握下列知识通过实验掌握下列知识: :1、DEBUG DEBUG命令命令命令:G,N,W,L :G,N,W,L :G,N,W,L及及Q 。

2、80888088系统中数据在内存中的存放方式和内存操作数的几种寻址方式。

系统中数据在内存中的存放方式和内存操作数的几种寻址方式。

系统中数据在内存中的存放方式和内存操作数的几种寻址方式。

3、80888088指令指令指令:INC,DEC,LOOP,INT 3,INT 20H,:INC,DEC,LOOP,INT 3,INT 20H,:INC,DEC,LOOP,INT 3,INT 20H,寄存器寄存器寄存器SI,DI SI,DI SI,DI。

4、80888088汇编语言伪操作汇编语言伪操作汇编语言伪操作:BYTE PTR,WORD PTR :BYTE PTR,WORD PTR :BYTE PTR,WORD PTR。

5、求累加和程序和多字节加减法程序。

、求累加和程序和多字节加减法程序。

实验内容和步骤:一、内存操作数及各种寻址方式使用一、内存操作数及各种寻址方式使用: :内容内容: :MOVAX,1234 MOV[1000],AX MOVBX,1002 MOVBYTE PTR[BX],20 MOVDL,39 INCBX MOV[BX],DL DECDL MOVSI,3 MOV[BX+SI],DL MOV[BX+SI+1],DL MOV WORD PTR[BX+SI+2],2846步骤:1)1)用用A 命令键入上述程序命令键入上述程序,,并用并用T T 命令逐条运行。

命令逐条运行。

2)2)每运行一条有关内存操作数的指令每运行一条有关内存操作数的指令每运行一条有关内存操作数的指令,,要用要用D D 命令检查并记录有关内存单元的内容并注明是什么寻址方式。

明是什么寻址方式。

注意注意D D 命令显示结果中右边的命令显示结果中右边的ASCII ASCII ASCII字符及双字节数存放法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二算术运算类操作实验 (基础与设计)一、实验要求和目的1、了解汇编语言中的二进制、十六进制、十进制、BCD 码的表示形式;2、掌握各类运算类指令对各状态标志位的影响及测试方法;3、熟悉汇编语言二进制多字节加减法基本指令的使用方法;4、熟悉无符号数和有符号数乘法和除法指令的使用;5、掌握符号位扩展指令的使用。

6、掌握BCD 码调整指令的使用方法二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识本实验主要进行算术运算程序设计和调试,涉及到的知识点包括:1.加减法处理指令主要有加法指令ADD,带进位加法ADC,减法指令SUB,带进位减法指令SBB。

2.乘除法指令和符号位扩展指令主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令IDIV,以及符号位从字节扩展到字的指令CBW 和从字扩展到双字的指令CWD。

3.BCD 码的调整指令主要有压缩的BCD 码加法调整指令DAA,压缩的BCD 码减法调整指令DAS,非压缩的BCD 码加法调整指令AAA,非压缩的BCD 码减法调整指令AAS,乘法的非压缩BCD 码调整指令AAM,除法的非压缩BCD 码调整指令AAD。

8088/8086 指令系统提供了实现加、减、乘、除运算的上述基本指令,可对表1 所示的数据类型进行数据运算。

四、实验内容与步骤1、对于两组无符号数,087H 和034H,0C2H 和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响:程序代码:CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,0C2HMOV BX,5FHADD AX,BXMOV AX,0C2H SUB AX,BX MOV AX,0C2H MUL BXMOV AX,0C2H DIV BXMOV AH,4CHINT 21H其中CF:进位标志位 运算结果需要进位为1 不需进位为0AF:辅助进位标志 第3为有进位为1 无进位为0ZF:零标志位 结果为0则为1 非0为0OF:溢出标志位 进行有符号数运算时超范围为1 未超为0SF:符号位标志 结果为负为1 非负非0PF:奇偶标志位 结果1的个数为偶数为0 奇数为12、在数据段定义了两个多精度的有符号16 进制数,FIRST 和SECOND ,1)求两数的和与差,并将结果存放在THIRD 为首地址的缓冲区中;2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH 为首地址的缓冲区中。

试编程实现上述运算。

FIRST DW 45 H,82H,96 H,57HSECOND DW 12 H,46H,83 H,45H程序代码:十六进制加法:DATAS SEGMENTFIRST DB 45H,82H,96H,57HSECOND DB 12H,46H,83H,45HTHIRD DB 5 DUP(0)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLEA SI,FIRSTLEA DI,SECONDLEA BX,THIRDMOV AL,[SI+3]MOV DL,[DI+3]ADD AL,DLMOV [BX+4],ALMOV AL,[SI+2] MOV DL,[DI+2]ADC AL,DLMOV [BX+3],ALMOV AL,[SI+1]MOV DL,[DI+1]ADC AL,DLMOV [BX+2],ALMOV AL,[SI]MOV DL,[DI]ADC AL,DLMOV [BX+1],ALMOV DL,0;检测最高位是否有进位ADC DL,0MOV [BX],DLMOV AH,4CHINT 21HCODES ENDSENDSTART十进制的加法:DATAS SEGMENTFIRST DB 45H,82H,96H,57HSECOND DB 12H,46H,83H,45HTHIRD DB 5 DUP(0)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLEA SI,FIRSTLEA DI,SECONDLEA BX,THIRDMOV AL,[SI+3] MOV DL,[DI+3]ADD AL,DLDAA;实现十六进制向十进制的转换MOV [BX+4],ALMOV AL,[SI+2]MOV DL,[DI+2]ADC AL,DLDAAMOV [BX+3],ALMOV AL,[SI+1]MOV DL,[DI+1]ADC AL,DLDAAMOV [BX+2],ALMOVAL,[SI]MOV DL,[DI] ADC AL,DL DAAMOV [BX+1],AL MOV DL,0 ADC DL,0 DAA MOV [BX],DL MOV AH,4CHINT 21H CODES ENDS ENDSTART实验结果:十六进制的减法:DATAS SEGMENTFIRST DB 45H,82H,96H,57HSECOND DB 12H,46H,83H,45HFORTH DB 4 DUP(0)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLEA SI,FIRSTLEA DI,SECONDLEA BX,FORTHMOV AL,[SI+3]MOV DL,[DI+3]SUB AL,DLMOV [BX+3],AL MOV AL,[SI+2] MOV DL,[DI+2] SBB AL,DL MOV [BX+2],AL MOV AL,[SI+1] MOV DL,[DI+1] SBB AL,DL MOV [BX+1],AL MOV AL,[SI] MOV DL,[DI] SBB AL,DL MOV [BX],ALMOV AH,4CHINT 21H CODES ENDS ENDSTART实验结果:十进制的减法:DATAS SEGMENTFIRST DB 45H,82H,96H,57H SECOND DB 12H,46H,83H,45H FORTH DB 4 DUP(0)DATAS ENDSCODES SEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLEA SI,FIRSTLEA DI,SECONDLEA BX,FORTHMOV AL,[SI+3]MOV DL,[DI+3]SUB AL,DLDASMOV [BX+3],ALMOV AL,[SI+2]MOV DL,[DI+2] SBB AL,DL DASMOV [BX+2],AL MOV AL,[SI+1] MOV DL,[DI+1] SBB AL,DL DASMOV [BX+1],AL MOV AL,[SI] MOV DL,[DI] SBB AL,DL DASMOV [BX],AL MOV AH,4CHINT 21H CODES ENDS ENDSTART实验结果:3、编程计算((Z +X*Y -328) -V)/ Y,其中X、Y、Z、V 均为16 位带符号数,假设初始数据分别装入X、Y、Z、V 单元,要求上式计算结果的商存入AX,余数存入DX 寄存器。

同学自行给出初始值加以验证程序。

((0C2H+087H*034H-328)-05FH)/087H结果:商82H 余数:1FH程序代码:DATAS SEGMENTX DW 087HY DW 034HZ DW 0C2HV DW 05FH;为X,Y,Z,V赋初值进行验证DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AX,XIMUL YMOV CX,AXMOV BX,DX;保护相乘结果MOV AX,ZCWD;将Z拓展为双字ADDAX,CXADC DX,BX SUB AX,328 SBB DX,0 MOV CX,AX MOV BX,DX MOV AX,VCWD SUB CX,AX SBB BX,DX MOV AX,CX MOV DX,BX IDIV YMOV AH,4CHINT 21HCODES ENDS ENDSTART实验结果:五、实验心得通过本次实验掌握了运用汇编语言进行加、减、乘、除算术运算的方法,在实践练习中体会到了关于进位标志和辅助进位标志的一些问题,通过对于例题的编程操作和手动计算,体会到标志位的真正含义。

实验二中对于十六进制的加减法处理有了更正确的认识,尤其是在有效地址传送方面,有了较为深刻的理解,实验中还进行了十进制转换以及类型转换等操作,对于这些操作有了较为全面的认识。

另外,对于汇编语言程序编辑能够更加熟练应用。

相关文档
最新文档