8086 总汇编语言子程序程序设计

合集下载

8086指令系统及汇编语言程序设计

8086指令系统及汇编语言程序设计

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指令系统和汇编语言程序设计,可以编写高效、优化的程序,并深入了解计算机系统的底层运行原理。

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汇编语言程序设计——第一个程序

8086汇编语言程序设计——第一个程序

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语言顺序程序设计

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指令,可以实现过程的调用和返回。

第4章8086,8088微机汇编语言程序设计

第4章8086,8088微机汇编语言程序设计

2)段内偏移量(Offset) 它是标号与段起始地址之间相距的字节数,为一16位 无符号数。 3)类型(Type) 类型表示该标号所代表的指令的转移范围,分NEA R(近)与FAR(远)两种。NEAR类型的标号仅在 同一段内使用,用2字节指针给出转移的偏移量属性(即 只改变IP值,不改变CS值);而FAR类型的标号无此限 制,必须用4字节指针指出转移的段地址与段内偏移量。 当标号用作JMP或CALL等指令的目标操作数时,若 为段内转移或调用则采用NEAR类型;若为段间转移或 调用则应当采用FAR类型。 JMP FAR PTR LINE
第4章 8086/8088汇编语言程序设计
汇编语言程序设计是开发微机系统软件的基本 功,在程序设计中占有十分重要的地位。
由于汇编语言具有执行速度快和易于实现对硬件的控 制等独特的优点,所以至今它仍然是用户使用得较多的程 序设计语言。特别是在对于程序的空间和时间要求很高的 场合,以及需要直接控制设备的应用场合,汇编语言更是必 不可少了。 由于汇编语言本身的特点,本章将选择目前国内广泛 使用的IBM PC机作为基础机型,着重讨论8086/8088汇编 语言的基本语法规则和程序设计的基本方法,以掌握一般 汇编语言程序设计的初步技术。
(1)立即操作数 立即操作数在指令中直接给出,不需要使用 寄存器,也不涉及访问数据区的操作,只能作为 源操作数。立即操作数是整数,可以是1字节或 2字节。在汇编语言中,立即操作数用常量(包 括数值常量和符号常量)以及由常量与有关运算 符组成的数值表达式表示。 如:MOV BX,1000+5*3 (2)寄存器操作数 通用寄存器AX、BX、CX、DX、BP、 SP、DI、SI以及段寄存器CS、SS、D S、ES都可以作为操作数。如:MOV BX,AX

8086汇编语言程序设计的基本方法 共24页

8086汇编语言程序设计的基本方法 共24页


MOV CX,AX


;计算X*Y


;用CX存储结果低 位
IDIV W MOV AH,4CH INT 21H CODE ENDS END START

MOV BX,DX
;用BX存储结果高位

MOV AX,Z
;计算X*Y+Z
第5章 汇编语言程序设计
• 例3 把非压缩十进制数DAT1转换为压缩十进制数。
第5章 汇编语言程序设计
例题
• 例7 把从BUF单元开始的80个16位无符号数按从大到小的顺 序排列。
第5章 汇编语言程序设计
例题
• 例4-26 把从BUF单元开始的80个16位无符号数按从大到小的
顺序排列。
LOOP2:MOV AX,[SI]
DSEG SEGMENT
BUF DW 80 DUP(?)
SSEG SEGMENT STACK STK DB 20 DUP (0) SSEG ENDS
第5章 汇编语言程序设计
DSEG SEGMENT ARG DW 7138H,84A6H,29EH MAX DW ? DESG ENDS CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG FMAX:MOV AX,DSEG
AL←X
AL≥0? Y N
Y←-1
AL=0 Y N
Y←1
Y←0
结束
实现符号函数程序的流程图
第5章 汇编语言程序设计
编写程序如下: DSEG SEGMENT
VARX DB -25 VARY DB ? DSEG ENDS CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG START: MOV AX, DSEG

第九讲 8086汇编语言程序设计(3)

第九讲  8086汇编语言程序设计(3)
式中x、y、z、v均为有符号字数据。 设x、y、z、v的值存放在字变量X、 Y、Z、V中,结果存放在双字变量W之中, 程序的流程图如图4.1所示。
•第四章 8086/8088汇编语言程序设计
• 图 4 . 1 顺 序 运 算 程 序 流 程 图
•第四章 8086/8088汇编语言程序设计 源程序如下: DATA SEGMENT X DW 200
EXIT: MOV AH,4CH
END
START
•第四章 8086/8088汇编语言程序设计
例4.4:试编一程序,求三个带符号字数据中的最大值,并 将最大值存入MAX字单元中。 设三个带符号数分别在三个字变量X、Y、Z中存储。 程序流程图如下图所示
例4.4程 序流程图
•第四章 8086/8088汇编语言程序设计
Y
Z V
DW
DW DW
100
3000 10000
W DW
2 DUP(?)
DATA ENDS STACK SEGMENT PARA STACK ’STACK’ DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK
•第四章 8086/8088汇编语言程序设计 START:MOV AX,DATA MOV MOV DS,AX AX,X ;DATA→AX
•第四章 8086/8088汇编语言程序设计 程序如下: DATA SEGMENT DATA1 DB 80 DUP(?);学生成绩 DATA2 DB 5 DUP(0);为统计结果留出存储单元 DATA ENDS ; CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX MOV CX,80 LEA SI,DATA1 LEA DI,DATA2

8086 汇编语言顺序程序设计

8086 汇编语言顺序程序设计

汇编语言程序设计实验报告学院: 计算机科学与技术学院专业: 计算机科学与技术班级:计科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。

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

汇编语言程序设计实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科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。



教。

相关文档
最新文档