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程序集锦

一、计算X+Y=Z,将结果Z存入某存储单元。

(1). 实验程序如下:

STACK SEGMENT STACK

DW 64 DUP(?)

STACK ENDS

DATA SEGMENT

XL DW ? ;请在此处给X低位赋值

XH DW ? ;请在此处给X高位赋值

YL DW ? ;请在此处给Y低位赋值

YH DW ? ;请在此处给Y高位赋值

ZL DW ?

ZH DW ?

DATA E NDS

CODE S EGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AX,XL ;X低位送AX

ADD AX,YL ;X低位加Y低位

MOV ZL,AX ;存低位和

MOV AX,XH ;X高位送AX

ADC AX,YH ;X高位加Y高位

MOV ZH,AX

A1: JMP A1

CODE E NDS

END START

二、计算X-Y=Z,其中X、Y、Z为BCD码。实验程序及流程如下:STACK SEGMENT STACK

DW 64 DUP(?)

STACK ENDS

DATA SEGMENT

X DW ? ;请在此处给X赋值

Y DW ? ;请在此处给Y赋值

Z DW ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AH,00H

SAHF

MOV CX,0002H

LEA SI, X

LEA DI, Z

A1: MOV AL,[SI]

SBB AL,[SI+02H]

DAS

PUSHF

AND AL,0FH

8086汇编语言实现简易计算器

8086汇编语言实现简易计算器

8086汇编语⾔实现简易计算器

8086汇编语⾔实现简易计算器

本周看了⼀个很有意思的知识。

C语⾔的编译器最初是怎么来的?

最初应该是由汇编语⾔实现⼀个简化版C语⾔,然后使⽤简化版的C语⾔进⾏多次迭代,功能更新,从⽽出现了如今强⼤的C语⾔。

本⼈找到了⼀个古⽼的课程设计,当时学汇编时候的⼀个⼩demo分享出来。

1.概述

为了更深⼊地理解计算机⼯作原理以及CPU的功能和结构,掌握汇编语⾔的使⽤。本⽂以简易计算器程序的汇编语⾔实现为主要任务,进⾏对程序的⼀些算法和汇编语⾔语法的论述。计算器是最简单的计算⼯具,简单计算器具有加、减、乘、除四项运算功能。想要⽤汇编语⾔实现简单的计算器,就必须通过对数据存储,寄存器的使⽤,加减乘除相关指令以及模块的调⽤等汇编语⾔知识进⾏运⽤,以实现⼀个基本功能完善,界⾯友好,操作简便易⾏的计算器。⽤汇编语⾔实现简单计算器还涉及到输⼊输出模块的设计,加减乘除运算的判断以及退出程序的判断的设计。通过对各种指令的合理使⽤,设计各个功能模块。当实现各个程序模块后,通过程序的调⽤最终实现⼀个简单的计算器。本⽂以⽤8086汇编语⾔实现简易计算器为⽬标,对程序的算法以及结构进⾏分析和解释。

汇编语⾔的语句类型有指令语句、伪指令语句和宏指令语句。

在实现简易计算器的过程中暂不需要宏指令语句,故对此语句不进⾏介绍。

计算器的实现需要使⽤输⼊输出,DOS系统的01H,02H,09H号调⽤可以完成所需功能。

由于简易计算器对结果没有很⾼的范围要求,故对四则运算只需考虑ADD,SUB,MUL,DIV等指令。在计算器中,输⼊的是10进制数字,⽽在汇编语⾔中读⼊字符只能⼀位⼀位的读取,故需要使⽤MUL设置⼀个循环算法,将输⼊的数字以16进制形式放⼊寄存器中,⽽输出则是使⽤MOD设置⼀个循环算法,将16进制转化为10进制后处理为ASCII码进⾏输出。

8086汇编rep指令

8086汇编rep指令

8086汇编rep指令8086汇编 rep 指令

rep指令常和串传送指令搭配使⽤

功能:根据cx的值,重复执⾏后⾯的指令

串传送指令1: movsb

功能:(以字节为单位传送)

(1) ((es)×16 + (di)) = ((ds) ×16 + (si))

(2) 如果DF = 0则: (si) = (si) + 1

(di) = (di) + 1

如果DF = 1则: (si) = (si) - 1

(di) = (di) - 1

串传送指令2:movsw

功能:(以字为单位传送)

(1) ((es)×16 + (di)) = ((ds) ×16 + (si))

(2) 如果DF = 0则: (si) = (si) + 2

(di) = (di) + 2

如果DF = 1则: (si) = (si) - 2

(di) = (di) - 2

rep 指令使⽤

任务:⽤串传送指令,将F000H段中的最后

// F000H段的最后⼀个字符的位置:F000:FFFF

16个字符复制到data段中。

data segment

db 16 dup (0)

data ends

8086汇编指令

8086汇编指令

一、数据传输指令 d]DV\ * v 作用:它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 5%} e j)@ 1. 通用数据传送指令. 3 E* | ^* MOV 传送字或字节. / l$enexSt MOVSX 先符号扩展,再传送. wQSan&81Q MOVZX 先零扩展,再传送. % 7ng AIg PUSH 把字压入堆栈. R*r4)+ gd POP 把字弹出堆栈. Sgi`&; PF PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. a0 |h LqI POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. D h E-g < PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. 5f*_K6 ,v POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. OHn dZ$'fI BSWAP 交换32位寄存器里字节的顺序 \]> YLyG XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) N` W [Q >n CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) COw "6czX/ XADD 先交换再累加.( 结果在第一个操作数里 ) PK +sGV XLAT 字节查表转换. >+ { W iZ` BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL ) k!Yc_ZB:*l 2. 输入输出端口传送指令. L"b& OIN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) X /c8 XLe" OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) PMAz[w,R ~ 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535. 8" &! 3_ 3. 目的地址传送指令. LEA 装入有效地址. A Myg> n! 例: LEA DX,string ;把偏移地址存到DX. Zv@qdY < : LDS 传送目标指针,把指针内容装入DS. 9Jwd*gevV 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. 5M >h[Q"R LES 传送目标指针,把指针内容装入ES. ) ^ (gwE 例: LES DI,string ;把段地址:偏移地址存到ESI. hNX ZL >6 LFS 传送目标指针,把指针内容装入FS. DW U=qD+ 例: LFS DI,string ;把段地址:偏移地址存到FSI. 3S3 a |_+% LGS 传送目标指针,把指针内容装入GS. =K : [ 26 例: LGS DI,string ;把段地址:偏移地址存到GSI. >*EZZ\eU ! LSS 传送目标指针,把指针内容装入SS. & R_ ?6*n 例: LSS DI,string ;把段地址:偏移地址存到SSI. J '2 Y r n 4. 标志传送指令. Gor 9 &aJ1 LAHF 标志寄存器传送,把标志装入AH. 43k'96[2d SAHF 标志寄存器传送,把AH内容装入标志寄存器. o%'1=d3R1Q PUSHF 标志入栈. a6 gw6jQ POPF 标志出栈. b hD-;Y!6; PUSHD 32位标志入栈. CW eQv9h]X POPD 32位标志出栈. @A6 iY 二、算术运算指令 J 299 mgB ADD 加法. (RI)ADC 带进位加法. ~+ {*KPiD INC 加 1. oO;L l? ~ AAA 加法的ASCII码调整. At@0G\^ DAA 加法的十进制调整. '| g sm O SUB 减法. T"P}` mT SBB 带借位减法. KAZDEC 减 1. d_( >:|o h NEC 求反(以 0 减之). X [ Iy6q t CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). 8{0XqE~ix= AAS 减法的ASCII码调整. 8 \

8086 汇编语言循环程序设计

8086 汇编语言循环程序设计

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

学院:计算机科学与技术专业:计算机科学与技术班级:计科131

MOV SI,-1

NEXT: INC SI

CMP ENG[SI],'S'

JZ L1

JMP L

L: CMP ENG[SI],'$' JZ EXIT

JMP NEXT

L1: INC SI

CMP ENG[SI],'U'

JZ L2

JMP L

L2: INC SI

CMP ENG[SI] ,'N' JZ L3

JMP L

L3: INC COUNT

JMP NEXT

MOV AX,COUNT+1 EXIT:

LEA DX,STR

MOV AH,9

INT 21H

MOV DL,COUNT

MOV DH,0

ADD DL,30H

MOV AH,2

INT 21H

MOV AH,4CH

INT 21H

CODE ENDS

END START

2.用emu8086实现

实验二:编程实现:将DX 中的十六进制数转换为ASCII 码,存放到BUF 开始的内存单元中去,并在屏幕显示出数值。

1.编程,源程序如下

DATA SEGMENT

BUF DB 100 DUP

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET BUF

MOV CH,4

NEXT:MOV CL,4

ROL DX,CL

MOV AL,BL

AND AL,0FH

ADD AL,30H

CMP AL,3AH

JL STORE

ADD AL,7

STORE:MOV [SI],AL

MOV AH,2

MOV DL,AL

8086汇编实现的五子棋小游戏

8086汇编实现的五子棋小游戏

8086汇编实现的五⼦棋⼩游戏

⼀、五⼦程序设计要求

汇编实现五⼦棋游戏。

⾸先显⽰空⽩棋盘,让玩家选择旗⾊,⽩⼦先⾏。

进⼊游戏对弈循环

只要有⼀⽅连成同⾊五⼦,即获胜。

事先写了⼀个普通的c++五⼦棋,然后将这个思路⽤汇编实现出来,代码逾500⾏,五⼦棋功能⽐较完善了,获胜逻辑什么的判断部分基本没有问题,花费了我很⼤的精⼒。选择旗⾊,先⼿玩家即为⽩⾊,后⼿玩家为⿊⾊,分别以W,B代表⿊⽩棋⼦。

⼆、设计思路

五⼦棋,⾸先需要显⽰棋盘,然后玩家输⼊落⼦坐标,⽩⽅落⼦,⿊⽅落⼦,落⼦循环,其中每次落⼦都要判断⼀次落⼦点是否已经有棋⼦了,那就需要提醒玩家重新输⼊落⼦坐标,同理玩家输⼊的坐标超出棋盘边界的时候也要提醒玩家。

落⼦的部分解决了,就得考虑获胜的判定逻辑了,每次成功的落⼦,就要对该坐标进⾏判定,我的判定获胜的⽅法是这样的,对于落⼦坐标进⾏四类判定,⼀种是横向的,⼀种是纵向的,另外两类是左上到右下,与左下到右上的,这样就涵盖了所有的获胜的情况,并且具体怎么实现?设定⼀个变量COUNT计算同⼀线上的同⾊棋⼦数⽬,COUNT初始为1。从落⼦坐标出发,对于横向的,分两种搜索,⼀类向左搜索,遇到同类的棋⼦COUNT+1,⼀旦不是同⾊棋⼦或者是搜索到棋盘外便转到向右搜索的循环中去,每次COUNT+1后判断是否达到5,达到5了则当前落⼦⽅获胜,遇到⾮同⾊棋⼦或搜索到棋盘外跳出循环,重置COUNT为1后进⼊其它三类判定,其它三类的获胜判定与该法原理⼀致。原理简单易懂,但是在汇编上实现起来还是遇到了不少问题的。同时,每次有效落⼦的时候有个变量OVERFLOW需要+1,这个是计算和棋的变量,五⼦棋的棋盘是15*15⼤⼩的,当OVERFLOW达到225时还没有决出胜负,这时候便可以宣布和棋了。

8086指令系统汇编实训实例

8086指令系统汇编实训实例

8086指令系统实训实例

一、80x86微处理器中的寄存器

图1-1 80x86微处理器的基本结构寄存器

标志寄存器对照表

序号

类别

1

2

3

4

5

6

7

8

9

EFLAG OF DF IF TF SF ZF AF PF CF DEBUG=1 OV DN EI NG ZR AC PE CY DEBUG=0

NV

UP

DI

PL

NZ

NA

PO

NC

标志名称 设置 未设置

标志名称 设置 未设置

溢出 OV(溢出) NV(未溢出) 零位 ZR (为0) NZ(不等于零)

方向 UP(增加) DN (减少) 辅助进位 AC (有进位)NA(无进位)

中断 EI(许可) DI(禁止) 奇偶标志 PE(偶) PO(奇)

符号 NG(负) PL(正) 进位 CY (有进位) NC(清除进位)

累加器AH AL BH BL CL DH

DL

CH SP SI DI IP FLAGS CS DS SS ES

BP 基址寄存器 计数寄存器 数据寄存器 堆栈指针寄存器 基址指针寄存器 源变址寄存器 目的变址寄存器 指令指针寄存器 标志寄存器 代码段寄存器 段寄存器 附加段寄存器

堆栈段寄存器 数据寄存器

地址指针和 变址寄存器 控制寄存器 通用寄存器

数据段寄存器

二、用DEBUG软件学习汇编语言

DEBUG的几点规则说明:

1.所有数据默认为16进制数,后缀“H”不用加;

2.DEBUG命令都是一个字母,字母大小写不分,后面的参数可以用空格分开,

也可以不用;命令与数字之间可以不分开,但是两个十六进制数字之间必须分开,如:

L100 = L 100;100 110 ≠100110 ;

排序

排序

实验一、用8086/8088汇编语言进行数据排序

一、实验目的:

1、熟悉EMU8086集成开发环境的使用。

2、通过编程、上机调试,进一步理解汇编语言的设计思路与执行过程。

3、熟悉INT 21H中断调用。

4、掌握数据排序的常用算法,利用汇编语言实现数据排序。

5、巩固理论知识,锻炼动手编程。

二、实验内容:

1、在TABLE1开始的内存单元中,预先存储100个有符号字类型的数值。

2、编写代码、将TABLE1中的100个数值,按照从大到小的排序,放在TABLE2开始

的内存单元中。

3、将TABLE2中的数字,顺序输出在屏幕上。

4、查看TABLE1开始的内存的100个数值。

5、查看TABLE2开始的内存的100个数值。

三、设计思路:

1、自定义一个display函数,用来往屏幕上显示特定的字符。

2、定义一个data段,用来存储固定的字符。

3、定义一个code段,当做主程序。

4、所用的方法是冒泡排序法

5、主程序中第一步先获取键盘输入。

6、主程序中第二步将键盘输入的数存储到内存中。

7、主程序中第三步用[基址+变址]方法进行冒泡排序。

8、主程序中第四步将排序好后新的数组从内存中取出,并回显到屏幕上。

四、排序算法:

1、冒泡排序:

(1)比较相邻的两个元素,如果第二个比第一个大,则交换这两个值。

(2)对每一对相邻元素做相同的工作,从开始第一对到结尾的最后一对,这样最后

的元素应该会是最大的数。

(3)针对所有的元素重复以上的步骤,除去最后一个。(实际过程中是最后一个值和

后面的一个空值进行比较)

(4)重复(1)~(3),直至排序完成。

8086汇编语言习题解答

8086汇编语言习题解答

8086汇编语言习题解答

第一章

1.1、试根据自己使用计算机的经历,列举几个必须使用或最好是使

用汇编

语言编制程序的事例。1.2、试完成下列数制间的转换⑴、十进制数

转换为8位二进制数十进制:100

对应二进制:01100100B

十进制:56对应二进制:00111000B十进制:111对应二进制:01101111B十进制:120对应二进制:01111000B

十进制:70对应二进制:01000110B⑵、8位二进制数(无符号数)转

换为十进制数

二进制:01010101B二进制:10101010B二进制:11110000B二进制:00001111B

对应对应对应对应

十进制:85十进制:170十进制:240十进制:15

⑶、十进制数转换为十六进制数

十进制:40

对应二进制:00101000B

十进制:80对应二进制:01010000B十进制:105对应二进制:01101001B十进制:114对应二进制:01101101B

十进制:207对应二进制:11001111B

1.3、试把下面用补码表示的二进制数转换为对应的十进制真值二进制补码:01111000二进制补码:11011001二进制补码:10000001二进制补码:10001000二进制补码:00100111二进制补码:11110000

对应的十进制值数真值:+120对应的十进制值数真值:-39对应的十进制值数真值:-127对应的十进制值数真值:-120对应的十进制值数真值:+39对应的十进制值数真值:-16

1.4、由键盘输入字符通常都是以该字符的ASCII码形式表示的。若现在从键盘上输入十六进制数0~F,那么应如何处理才能把十六进制转换为4位二进制数0000~1111.

第四章:8086汇编语言程序设计

第四章:8086汇编语言程序设计

1、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言一般由四部分组成。 汇编语言一般由四部分组成。
其典型的汇编语句格式: 其典型的汇编语句格式: 标号: 标号:操作码
例如: 例如: START: START:MOV AL,30H AL,30H ;(AL)=30H (AL)=30H 30
1.汇编程序 . 汇编是把汇编语言程序翻译成机器语言描述的目标程序 的过程。 的过程。 汇编程序是完成汇编任务的程序。 汇编程序是完成汇编任务的程序。 2.连接程序 . 连接程序的主要功能是实现多个目标文件及库文件的连 并完成浮动地位的重定位。 接,并完成浮动地位的重定位。 从汇编语言源程序到可执行程序的生成过程如图所示。 从汇编语言源程序到可执行程序的生成过程如图所示。
第 4章
汇编语言程序设计
汇编语言程序设计
经过任务分析、算法优化后, 经过任务分析、算法优化后, 在微型机上使用编 首先, 首先,要对单片机应用 就可以进行程序的总体构思, 就可以进行程序的总体构思, 辑软件编写源程序, 辑软件编写源程序, 系统预完成的任务进行 确定程序的结构和数据形式, 确定程序的结构和数据形式, 在使用交叉汇编的 深入的分析, 深入的分析,明确系统 并考虑资源的分配和参数的 方法对源程序进行 的设计任务、 的设计任务、功能要求 计算等。 计算等。然后根据程序运行 汇编, 汇编,然后采用串 和技术指标。其次, 和技术指标。其次,要 的过程, 的过程,勾画出程序执行的 算法是解决具体问题 行通信的方法, 行通信的方法,把 对系统的硬件资源和工 逻辑顺序, 。同一个问题 逻辑顺序,用图形符号将总 的方法。 的方法 汇编得到的目标程 作环境进行分析。 ,, 作环境进行分析。这是 体设计思路及程序流向绘制 的算法可以有多种, 的算法可以有多种 序传送到单片机内, 序传送到单片机内 单片机应用系统程序设 在平面图上, 在平面图上,从而使程序的 结果也可能不尽相同, 结果也可能不尽相同, 并进行程序运行和 计的基础和条件 结构关系直观明了, 结构关系直观明了,便于检 所以, 调试 所以,应对各种算法 查和修改。 查和修改。 进行分析比较,并进 进行分析比较, 行合理的优化

8086汇编经典例程

8086汇编经典例程

========================================== 5.编写一个数组排序(从小到大)的小程序,数组在程序中定义,程序先将原数组显示一遍,然后排序,再将排好序的数组显示一遍.

========================================== AAA SEGMENT

BUF DB ’6455412345$’

L = $ — BUF

ary dw —897,345,6789,8654,-1234,

—3456,—99,—678,987,567,

32762,-12121,0,3434,4645,—234,

23455,—100,100,1000,—1000

dw 572,—2345,-6543,—1234,9999 len dw ($-ary)/2

ASSUME CS:AAA, DS:AAA

MAIN PROC FAR

PUSH CS

POP DS

LEA SI,ARY

MOV CX,LEN

NEXT3: MOV BX,[SI]

CALL DISP

CALL SPACE

ADD SI,2

LOOP NEXT3

CALL CRLF

CALL CRLF

LEA SI,ARY

MOV CX,LEN

CALL SORT

LEA SI,ARY

MOV CX,LEN

NEXT5: MOV BX,[SI]

CALL DISP

CALL SPACE

ADD SI,2

LOOP NEXT5

MOV AH,4CH

INT 21H MAIN ENDP

DISP PROC

PUSH SI

PUSH AX

PUSH BX

PUSH DX

8086汇编

8086汇编

mov dx,400h
mov si,500h
mov di,600h
add ax,bx
mov [si],ax
mov [di+bx],cx
mov [si+bx],dx
mov [si+1],cx
mov [si+bx+1],ax
2021/4/6
int 3
7
对标志寄存器F说明
标志名称
=1
=0
溢出
OV
NV
方向
2021/4/6
3
DEBUG的使用
DEBUG 的子命令(1)
命令 参数 R [寄存器名]
D [地址或地址范围] E 地址 [列表] C 一首址L长度 二首址 F首址L长度 内容 M源地址范围 目地址首址 S查找范围 查找的字符
作用 显示或修改寄存器内容
显示存储器内容 修改存储器内容 比较两存储器块的内容 修改存储器块的内容 存储器块的传送 字符的查找
2021/4/6
4
DEBUG的使用
DEBUG 的子命令(2)
命令 参数
作用
H 16进制参数1 参数2 16进制加减运算
A [地址]
编写汇编源程序
U[首地址或地址范围] 反汇编
T[=地址][指令个数] 单步执行
G[=地址1][地址2][…] 按断点运行

8086 汇编例程

8086 汇编例程

汇编语言(应用)程序(80X86/Pentium)

设计:乐金松

广东工业大学电子与信息工程学院

;This program for:R0R1-R2R3=R4R5

;---------------------------------------------------------------- ;define stack segment

STACK SEGMENT STACK 'STACK'

DB 1024 DUP (0)

STACK ENDS

;define data segment

DATA SEGMENT

R0 DW (?)

R1 DW (?)

R2 DW (?)

R3 DW (?)

R4 DW (?)

R5 DW (?)

R6 DW (?)

R7 DW (?)

DATA ENDS

;define code segment

NDWSUB SEGMENT

;

MAIN PROC FAR

ASSUME CS:NDWSUB,DS:DATA,SS:STACK

;

START: PUSH DS ;return DOS standard program

MOV AX,0

PUSH AX

MOV AX,DATA ;set DS

MOV DS,AX

MOV AX,R1

SUB AX,R3

MOV R5,AX

MOV AX,R0

SBB AX,R2

MOV R4,AX

RET

MAIN ENDP

NDWSUB ENDS

END START

;This program for:R0R1+R2R3=R4R5

;---------------------------------------------------------------- ;define stack segment

简单计算器8086汇编代码

简单计算器8086汇编代码

【课题5】模拟十进制计算器(加,减)

(一)设计要求

1.通过小键盘输入,做十进制的加、减运算,允许五位数以内的不同数位的2个数相加

或相减,连加与/或连减。七段数码管显示器的高位作为符号位,其他5位作为输入数据和计算结果的显示。

2.数字用小键盘0~9;功能键为:A,B,C,D。

C———开始运算(包括取消没有完成的运算),六位七段数码管全部显示‘0’。

A———‘+’,加法操作。

B———‘-’,减法操作。

D———‘=’,计算并显示结果。

3.运算规则(按照一般计算器的功能要求):

a.输入第一个数据,显示器跟随显示。

b.按‘+’或‘-’,显示器内容不变。

c.再输入第二个数据,显示器跟随显示。

d.按‘=’,显示器显示计算结果,当超出能显示的最大值时,显示“F”(溢出)。

e.按‘C’,清除显示,重新开始运算。

(二)提示

1.七段数码管显示和键盘可参考软件实验9、10,LED显示实验,以及可参阅教材第9

章有关章节。

2.显示是动态的、要不断刷新,建议把键盘输入与运算作为主程序,动态显示作为子程

序,在主程序中调用显示子程序。

(三)要完成的工作

1.设计出完整的汇编语言程序。

2.上机调试,在实验系统中通过验收。

3.写出课程设计报告,内容包括:设计思想、功能流程图、结果讨论和完整的源程序。

;(1)通过小键盘做十进制的加、减运算,允许不同数位的5个数相加或相减。七段数码管显示器作输入数据和结果数据的显示。

;(2)数字用小键盘0~9,A、B、C、D作功能键。

;C———开始运算(包括撤销运算),显示‘0’。

;A———‘+’。

8086汇编语言学习(三)8086中的段和栈

8086汇编语言学习(三)8086中的段和栈

8086汇编语⾔学习(三)8086中的段和栈

1. 8086汇编中的段

段地址

8086对内存寻址的⽅式是通过段地址*16+偏移地址的⽅式实现的,⽽在16位的8086CPU下,段地址和偏移地址也都是16位的。这意味着,对于任意⼀个段,段的起始地址必定为16的倍数(段地址*16)。

对于同⼀个内存地址,存在多种不同的内存寻址⽅式:

例如:段地址1000H+偏移地址2345H,与段地址1234H+偏移地址0005H都可以对内存地址12345H进⾏寻址(段地址1204H+偏移地址0305H等等也可⾏,⾮常⾃由)。

段的最⼤空间为2^16bit=64KB(例如:将段地址设为1000H,将段的⼤⼩设置为64KB,则段的内存范围为10000H-1FFFFH)。

段的最⼩空间为2^4bit=16bit (例如:将段地址设为1234H,将段的⼤⼩设置为16bit,则段的内存范围为12340H-1234FH)。

段的逻辑意义

需要注意,内存段的概念并不是内存硬件所固有的,⽽是从CPU寻址的⾓度出发,将内存中的物理连续区域逻辑上分隔为不同的区域。内存段这⼀概念的提出有利于在复杂程序、多程序系统中对同⼀程序的不同逻辑部分以及不同程序的内存进⾏更好的访问和管理。

段寄存器

内存段的存在能够划分同⼀程序中的不同逻辑部分,进⾏更有效的管理和更简单的访问。汇编程序的内存通常可以被划分为三部分:代码、栈以及数据。

通常为了避免混淆,会将这三种不同的逻辑部分分别存放在三个不同的内存段中,便于理解(当然也能将同⼀部分的内存存放在不同的段中,这主要取决于程序的复杂程度)。

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

==========================================

5.编写一个数组排序(从小到大)的小程序,数组在程序中定义,程序先将原数组显示一遍,然后排序,再将排好序的数组显示一遍。

==========================================

AAA SEGMENT

BUF DB '45$'

L = $ - BUF

ary dw -897,345,6789,8654,-1234,

-3456,-99,-678,987,567,

32762,-12121,0,3434,4645,-234,

23455,-100,100,1000,-1000

dw 572,-2345,-6543,-1234,9999

|

len dw ($-ary)/2

ASSUME CS:AAA, DS:AAA

MAIN PROC FAR

PUSH CS

POP DS

LEA SI,ARY

MOV CX,LEN

NEXT3: MOV BX,[SI]

CALL DISP

CALL SPACE

-

ADD SI,2

LOOP NEXT3

CALL CRLF

CALL CRLF

LEA SI,ARY

MOV CX,LEN

CALL SORT

LEA SI,ARY

MOV CX,LEN

NEXT5: MOV BX,[SI]

CALL DISP

CALL SPACE

ADD SI,2

LOOP NEXT5

MOV AH,4CH

INT 21H

MAIN ENDP

DISP PROC

PUSH SI

PUSH AX

PUSH BX

PUSH DX

PUSH CX

MOV CX,0

CMP BX,0

JNL NEXT1

NEG BX

MOV CX,1

NEXT1: LEA SI,BUF+l-1

MOV AX,BX

MOV BX,10

NEXT: MOV DX,0

}

DIV BX

ADD DL,30H

DEC SI

MOV [SI],DL

CMP AX,0

JNE NEXT

CMP CX,0

JE NEXT2

DEC SI

MOV BYTE PTR [SI],'-'

NEXT2: MOV DX,SI

MOV AH,9

INT 21H

POP CX

POP DX

POP BX

POP AX

POP SI

RET

DISP ENDP

SORT PROC

NEXTT: PUSH CX

MOV DI,SI

MOV AX,[SI]

NEXT0: CMP AX,[DI]

JL NEXTQ

MOV BX,AX

MOV AX,[DI]

MOV [DI],BX

NEXTQ: ADD DI,2

LOOP NEXT0

MOV [SI],AX

ADD SI,2

POP CX

LOOP NEXTT

RET

SORT ENDP

CRLF PROC

PUSH AX

PUSH DX

MOV DL,13

MOV AH,2

|

INT 21H MOV DL,10 INT 21H POP DX

POP AX

RET CRLF ENDP

SPACE PROC

PUSH AX

PUSH DX

MOV DL,' '

MOV AH,2

INT 21H

POP DX

POP AX

RET

SPACE ENDP

AAA ENDS

END MAIN

===============================================

6.!

7.编写一个程序,从键盘输入10个十进制数字字符,然后将这些数字加密存储在缓冲区BUFFER中。加解密表如下:==========================================

qqq segment

TAB1 DB 'QWERTYUIOPASDFGHJKLZXCVBNM'

TAB2 DB 'qazwsxedcrfvtgbyhnujmikolp'

TAB3 DB ')(*&^%/#@!'

LEN = $-tab1

MSS1 DB 13,10,'Please chose a

functioc:',0DH,0AH

DB ' 1--jiami ',0DH,0AH

DB ' 2---jiemi ',13,10

DB ' 0--exit$'

MSS2 DB 0dh,0ah,'Error! You have press " "

key!$'

MM1 DB 'Your input is:'

BUF1 DB 255 DUP()

MM2 DB 'My output is:'

BUF2 DB 255 DUP()

qqq ends

ccc segment

assume cs:ccc,ds:qqq

main proc far

start: mov ax,qqq

mov ds,ax

rep1: call crlf

LEA SI,BUF1

LEA DI,BUF2

lea dx,mss1 ;显示菜单

mov ah,9

int 21h

mov ah,1 ;输入你的选项

int 21h

#

cmp al,'0' ;输入0,结束

je quit

cmp al,'1' ;输入1,加密

je jiami

cmp al,'2' ;输入2,解密

je jiemi

mov [mss2+25],al ;其他字符,错误,重输

lea dx,mss2

mov ah,9

int 21h

jmp rep1

#

quit: mov ah,4ch

int 21h

jiami: call crlf

next1: mov ah,1

int 21h

cmp al,27

je NEXT14

MOV [SI],AL

cmp al,'A'

jnae next3

]

cmp al,'Z'

ja next3

相关文档
最新文档