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,内容如上所示。
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科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;。
8086指令系统及汇编语言程序设计8086指令系统是指8086微处理器能够支持和执行的一系列指令。
8086微处理器是Intel公司于1978年推出的一款16位微处理器,是一个革命性的产品,为个人计算机的发展奠定了基础。
8086微处理器采用的是复杂指令集(CISC)架构,其指令系统非常丰富,共有近1000条指令,能够完成各种复杂的计算和操作。
8086指令系统主要分为数据传输指令、算术运算指令、逻辑运算指令、移位指令、控制转移指令等几类。
数据传输指令主要用于数据在寄存器和存储器之间的传输,其中包括直接传输和间接传输两种方式。
算术运算指令用于执行各种加减乘除运算,包括有符号数和无符号数的运算。
逻辑运算指令用于执行逻辑操作,如与、或、异或等。
移位指令用于对数据进行位移操作,包括左移、右移等。
控制转移指令用于改变程序的执行顺序,包括无条件跳转、条件跳转等。
在汇编语言程序设计中,我们使用汇编语言来编写针对8086微处理器的程序。
汇编语言是一种低级编程语言,与机器语言直接对应,使用助记符代表机器指令。
汇编语言程序通过汇编器进行编译,生成可执行的机器码文件。
编写汇编语言程序的过程一般包括以下几个步骤:设计程序的逻辑结构、确定程序的算法、编写汇编语言源程序、进行程序调试、优化程序性能。
汇编语言程序设计可以用于解决各种计算机软件和硬件问题。
它可以用来编写底层驱动程序、操作系统、嵌入式系统等,也可以用来进行系统调试和性能优化。
总而言之,8086指令系统及汇编语言程序设计是计算机科学领域中重要的内容。
了解8086指令系统和掌握汇编语言程序设计对于理解计算机底层原理和解决一些底层问题非常有帮助。
同时,汇编语言程序设计也是一门艺术,通过编写高效的汇编语言程序,可以提高计算机的性能和响应速度。
8086汇编语言程序设计的基本方法8086汇编语言程序设计是一种低级编程语言,广泛应用于计算机系统的底层硬件控制与操作。
其基本方法包括程序结构设计、数据传输与处理、条件和循环控制以及输入输出等方面。
下面将对这些基本方法进行详细描述,以便更好地理解8086汇编语言程序设计。
1.程序结构设计:在8086汇编语言程序的设计中,程序结构是基本的骨架。
程序的结构应根据具体应用的需求来设计,一般包括程序的初始化、主程序(或主循环)、子程序(过程或函数)以及程序的结束等部分。
通过嵌套使用循环和条件控制语句,可以灵活地控制程序的流程,实现复杂的逻辑功能。
2.数据传输与处理:8086汇编语言提供了多种数据传输和处理指令,用于在寄存器和内存之间传输数据,以及对数据进行各种运算和处理。
常用的数据传输指令包括MOV(将数据从一个位置复制到另一个位置)、LEA(加载有效地址)、PUSH(将数据压入栈中)以及POP(将数据从栈中弹出)等。
数据处理的指令包括运算指令(如ADD、SUB、MUL、DIV等)和逻辑指令(AND、OR、NOT、XOR等),可以对数据进行加减乘除、位运算以及逻辑运算等操作。
3.条件和循环控制:条件和循环控制是在程序中实现有选择地执行一些代码块或多次执行一些代码块的关键部分。
8086汇编语言提供了多种条件和循环控制指令,如CMP(比较操作数)、JE(等于则跳转)、JNE(不等于则跳转)、JG(大于则跳转)、JL(小于则跳转)等。
通过这些指令的灵活运用,可以实现条件判断和循环控制的功能,从而实现复杂的逻辑操作。
4.输入输出:在8086汇编语言程序设计中,输入输出是与外部设备进行交互的重要环节。
输入输出可以通过中断机制来实现,其中INT21H是最常用的中断类型,可用于键盘输入、屏幕输出、磁盘文件读写等。
通过相应的系统调用,可以从用户获取输入数据,并将结果输出到屏幕或其他设备上。
此外,还可以使用IN和OUT指令直接与输入输出端口进行数据传输,实现与设备的硬件交互。
8086汇编语言程序设计
(1)汇编语言介绍
汇编语言(简称汇编)是一种低级语言,它能够与计算机硬件的指令
指令很好地接轨,是一种可靠的,有效的,灵活的编程语言。
主要用于编
写微型机,微处理器,单片机及PC机的程序。
汇编器是汇编语言的翻译器,它将高级语言(如C、C++等)翻译为机器语言指令,以达到执行程
序源代码的目的。
汇编语言程序设计(Assembly Language Programming)是以汇编语
言编写程序以满足特定应用的过程。
它主要用于写微机、微处理器等的控
制程序和系统程序,具有立即计算,快速反应,低耗能,成本低廉的优点。
(2)汇编语言编程
汇编语言编程主要是为了让CPU以机器语言运行,编程时可使用指令
集合或者标准指令。
根据指令可以让CPU执行计算机的功能,原理上看,
汇编语言编程是一种字节操作。
汇编程序编程需要使用CPU的指令集,这些指令可以被用来控制CPU
执行。
指令集又可分为实指令集和抽象指令集。
对于不同的CPU,他们的
指令集也是不一样的,因此需要根据CPU的不同选择合适的指令集。
在汇编语言编程中,常见的指令有加法,减法,乘法,除法,移位,
现行,条件转移等等。
汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科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。
指
导
教。