8086 总汇编语言子程序程序设计
- 格式:doc
- 大小:183.55 KB
- 文档页数:15
8086指令系统及汇编语言程序设计8086指令系统是指Intel 8086微处理器所支持的一套机器指令。
8086微处理器是Intel于1978年推出的一款16位微处理器,其指令系统设计清晰简洁,具有良好的可编程性和灵活性。
汇编语言程序设计则是使用汇编语言编写程序,通过汇编器将汇编语言转化为可执行文件的过程。
8086指令系统共有十六个16位的通用寄存器,包括AX、BX、CX和DX四个通用寄存器,在实模式下这些寄存器也可以拆分为两个8位的寄存器AH、AL、BH、BL、CH、CL、DH和DL。
另外,还有SP、BP、SI和DI四个指针寄存器,以及CS、DS、ES和SS四个段寄存器等。
这些寄存器提供了程序在内存中存储和访问数据的能力。
8086指令系统中的指令可以分为数据传输指令、算术指令、逻辑指令和控制指令等几个类别。
数据传输指令可以将数据从寄存器传输到寄存器、从存储器传输到寄存器,或者从寄存器传输到存储器等。
算术指令包括加法、减法、乘法、除法等运算指令。
逻辑指令可以执行与、或、非、异或等逻辑运算。
控制指令可以控制程序的执行流程,例如条件跳转、循环等。
汇编语言程序设计是通过使用汇编语言编写程序来实现特定功能。
汇编语言程序由一系列指令组成,每条指令由操作码和操作数组成。
操作码表示需要执行的操作,操作数则是参与操作的数据。
编写汇编语言程序需要熟悉8086指令系统的指令格式和功能,以及寄存器的使用方法。
汇编语言程序设计的开发流程包括分析问题、编写算法、编写程序、汇编和调试等步骤。
在开始编写程序之前,需要先分析问题,并根据问题需求设计算法。
然后根据算法编写汇编语言程序,并通过汇编器将其转化为机器码。
最后,通过调试工具进行程序的调试和测试,确保程序的正确性和可靠性。
总之,8086指令系统及汇编语言程序设计是一门用于编写底层程序的技术。
通过学习和掌握8086指令系统和汇编语言程序设计,可以编写高效、优化的程序,并深入了解计算机系统的底层运行原理。
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131POP SIPOP CXPOP AXRETPROADD ENDPARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW 10SUM DW ?TABLE DW 3 DUP(?)CODE ENDSEND MAIN使用相应的文本编辑器建立文件LAB5.asm,容如上所示。
二. 生成可执行文件:1.汇编:C:\masm> masm lab5;2.连接:C:\masm> link lab5;三. 请写出此程序中的变量ary,count,sum 的EA,并判断此程序的功能:四. 用debug 调试此程序时,第一条指令的段EA 是多少?此程序数据段偏移地址为0 的字单元数据为多少?其对应的机器指令是什么?-L ;加载程序文件lab5.exe-R ;查看IP 与CS 寄存器的容-D DS:0 ;查看当前数据段偏移地址为0 的字单元数据-U ;查看机器指令实验二:编写一个子程序,实现在屏幕的指定位置,用指定颜色,显示一个用0 结尾的字符串源程序如下data segmentstr db 'display string',0data endscode segmentassume cs:code,ds:datastart:mov ax,datapush ax ; 结果的商,也就是最后要放在dx中的mov ax, bx ; dx为 rem(H/N) * 65536, 为高16位,ax为低16位,再进行一次除法运算div cx ; ax 为商——最后结果的低16位,dx为余数——为最后结果,应赋给cxmov cx, dxpop dxretcode endsend start实验结果实验一:变量ary,count,sum 的EA分别是00140,00154,00156此程序的功能是数列求和实验二:实验三:实验总结这次实验,感觉难度最大的就是做2个子程序的设计,在网上向好友请教了N回!还犯了一些低级的错误,如将16位的寄存器的容传送到字符型数字串里去,这很明显是不对的,在逆序时寄存器的高16位会直接把正常的数字字符冲掉,还有就是将当我直接将字型单元的容传送字型单元时,编译器会报错,不过提示是它后面的指令错误。
8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。
Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。
汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。
学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。
⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。
假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。
D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。
1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。
伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。
⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。
汇编语⾔程序建⽴及汇编过程如图所⽰。
⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。
注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。
执⾏MASM和LINK命令时需要按多次回车。
3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
8086语言顺序程序设计8086是Intel8086微处理器的型号,它采用x86命令集,是早期个人计算机的重要组成部分。
8086语言顺序程序设计是使用8086汇编语言进行程序设计的过程,它是一种低级编程语言,通过直接控制计算机硬件来完成特定任务。
1.寻址方式在8086语言顺序程序设计中,可以使用多种寻址方式来访问内存数据,例如直接寻址、寄存器间接寻址、寄存器相对寻址等。
其中,直接寻址和寄存器间接寻址是使用最为广泛的,直接寻址通过给出内存地址来访问数据,寄存器间接寻址通过给出寄存器中存放的地址来访问数据。
2.数据传送数据传送是编程中最基本的操作之一、8086提供了多条数据传送指令,可以将数据从一个地方传送到另一个地方。
常用的数据传送指令有MOV、XCHG等。
MOV指令可以将一个数据从源操作数传送到目的操作数,XCHG指令可以交换两个操作数的值。
3.算术运算8086提供了多条算术运算指令,可以进行加法、减法、乘法和除法等运算。
例如,ADD指令可以用于两个操作数的加法运算,SUB指令可以用于两个操作数的减法运算,MUL指令可以用于两个操作数的乘法运算,DIV指令可以用于两个操作数的除法运算。
4.逻辑运算8086还提供了多条逻辑运算指令,可以进行与、或、非、异或等逻辑运算。
例如,AND指令可以用于两个操作数的与运算,OR指令可以用于两个操作数的或运算,NOT指令可以用于对一个操作数进行非运算,XOR指令可以用于两个操作数的异或运算。
5.循环循环是程序中常用的结构之一,8086提供了多条循环指令,可以根据特定条件来重复执行一些程序片段。
常用的循环指令有LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ等。
其中,LOOP指令可以根据CX寄存器的值来自动减1并跳转到指定的标号处。
6.过程过程是一组有关联的指令的集合,适用于在程序中被反复调用的任务。
8086提供了CALL和RET指令,可以实现过程的调用和返回。
汇编语言程序设计实验报告学院: 计算机科学与技术学院专业: 计算机科学与技术班级:计科131MOV AX,WORD PTR N1MOV DX,WORD PTR N1+2MOV CX,WORD PTR N2MOV BX,WORD PTR N2+2ADD AX,CXADC DX,BXMOV WORD PTR N3,AXMOV WORD PTR N3+2,DXMOV AH,4CHINT 21HCODE ENDSEND START使用相应的文本编辑器建立文件two、asm,内容如上所示。
二、生成可执行文件:1、汇编:C:\masm> masm two;2、连接:C:\masm> link two;三、运行及调试:1、运行:C:\masm>debug two、exe-U0 ;通过反汇编查找程序的断点-T=0 2 ;加载数据段-D0 ;查瞧原始数据就是否正确-G=0 1F ;运行程序至断点1F 处-D0 ;查瞧程序运行结果2、调试:若要判断此程序对于其它32 位数相加就是否正确,则需要使用DEBUG 进行程序调试。
实验二:编程实现:将从2000H 单元开始的连续128 个单元的内容进行清零一. 编程CODE SEGMENTASSUME CS:CODE,DS:CODESTART:MOV BX,2000HMOV CX,128MOV AL,00HL1:MOV [BX],ALINC BXLOOP L1MOV AH,4CHINT 21HCODE ENDSEND START二.使用编辑器建立源程序文件four、asm。
三.生成可执行文件:1、汇编:C:\masm> masm four;2、连接:C:\masm> link four;四、运行及调试:1、运行:C:\masm>debug four、exe-D2000;-R;-D CS:2000;-G;-D2000;实验三:编程实现:将3000H 单元的一个字节的内容进行拆分,高半字节放进3001H 单元的低半部分,其低半字节放进3002H 单元的低半部分一、编程源程序:DATA SEGMENTN0 DW 3000HN1 DW 3001HN2 DW 3002HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV BX,N0AND BX,0FHMOV AX,N2MOV AX,[BX]MOV BX,N0MOV CL,4SHR AX,CLMOV AX,N1MOV AX,[BX]MOV AH,4CHINT 21HCODE ENDSEND START二.使用编辑器建立源程序文件five、asm。
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131MOV AH,2INT 21H ;显示高位ASCII 码MOV DL,BLAND DL,0FHCMP DL,9JBE NEXT2ADD DL,7NEXT2: ADD DL,30HMOV AH,2INT 21H ;显示低位ASCII 码MOV AH,4CHINT 21HCODE ENDS ;返回DOSEND START使用相应的文本编辑器建立文件three.asm,内容如上所示。
2.生成可执行文件:1>.汇编:C:\masm> masm three;2>.连接:C:\masm> link three;3.运行及调试:1>. 运行:C:\masm>debug three.exe-U0 ;通过反汇编查找程序的断点-T=0 2 ;加载数据段-D0 ;查看原始数据是否正确-G=0 XX ;运行程序至断点XX 处-R ;查看程序运行结果以上命令执行的细节可参照实验二中的说明。
4.调试:修改AL 的内容,判断此程序是否能正确显示其中的内容的方法。
例:修改AL 内容为9AH:-L ;重新加载可执行文件-A0 ;重新修改MOV AL,3EH 指令361E:0000 MOV AL,9A361E:0002-G=0 xx;带断点运行-R ;查看程序运行结果实验二:编写一个数据区移动程序,要考虑源数据区与目的数据区有重叠的情况。
1.源程序如下所示,编辑下面的源程序到文件lab.asm 中:使用相应的文本编辑器建立文件lab.asm,内容如上所示。
2.生成可执行文件:1>.汇编:C:\masm> masm lab;2>.连接:C:\masm> link lab;N1:INC NUMBERJMP NUMBERJMP AGAINN2:INC CHARJMP AGAINEXIT:LEA DX,STR1MOV AH,09HINT 21HMOV DL,NUMBERADD DL,30HMOV AH,2INT 21HLEA DX,STR2MOV AH,09HINT 21HMOV DL,CHARADD DL,30HMOV AH,2INT 21HLEA DX,STR3MOV AH,09HINT 21HMOV DL,RESTADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START使用相应的文本编辑器建立文件lab1.asm,内容如上所示。
汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科131
二. 生成可执行文件:
1.汇编:
C:\masm> masm lab5;
2.连接:
C:\masm> link lab5;
三. 请写出此程序中的变量ary,count,sum 的EA,并判断此程序的功能:
四. 用debug 调试此程序时,第一条指令的段EA 是多少?此程序数据段偏移地址为0 的字单
元数据为多少?其对应的机器指令是什么?
-L ;加载程序文件lab5.exe
-R ;查看IP 与CS 寄存器的容
-D DS:0 ;查看当前数据段偏移地址为0 的字单元数据
-U ;查看机器指令
实验二:编写一个子程序,实现在屏幕的指定位置,用指定颜色,显示一个用0 结尾的字符串
源程序如下
data segment
str db 'display string',0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dh,8
mov dl,21
mov cl,3
; 参数:(ax) = 被除数dword型的低16位
; (dx) = 被除数dword型的高16位
; (cx) = 除数
; 返回:(dx) = 结果的高16位
; (ax) = 结果的低16位
; (cx) = 余数
divdw:
mov bx, ax ; 缓存ax——被除数的低16位
mov ax, dx ; ax = H,被除数的高16位
mov dx, 0
div cx ; ax 为商,dx为余数= rem(H/N) * 65536
push ax ; 结果的商,也就是最后要放在dx中的
mov ax, bx ; dx为rem(H/N) * 65536, 为高16位,ax为低16位,再进行一次除法运算 div cx ; ax 为商——最后结果的低16位,dx为余数——为最后结果,应赋给cx
mov cx, dx
pop dx
ret
code ends
end start
实验结果实验一:变量ary,count,sum 的EA分别是00140,00154,00156此程序的功能是数列求和
实验二:
实验三:
实
验
总
结
这次实验,感觉难度最大的就是做2个子程序的设计,在网上向好友请教了N回!
还犯了一些低级的错误,如将16位的寄存器的容传送到字符型数字串里去,这很明显是不对的,在逆序时寄存器的高16位会直接把正常的数字字符冲掉,还有就是将当我直接将字型单元的容传送字型单元时,编译器会报错,不过提示是它后面的指令错误。
转换后的数字串的末尾如果不是0的话,在调用输出子程序时会出现BUG,于是又在转换子程序里加了条指令,在第一次转换出来后,在数字串的末尾添加一个终止标志0。
指
导
教。