8086汇编经典例程
常用汇编语言8086程序集锦
一、计算X+Y=Z,将结果Z存入某存储单元。
(1). 实验程序如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTXL DW ? ;请在此处给X低位赋值XH DW ? ;请在此处给X高位赋值YL DW ? ;请在此处给Y低位赋值YH DW ? ;请在此处给Y高位赋值ZL DW ?ZH DW ?DATA E NDSCODE S EGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AX,XL ;X低位送AXADD AX,YL ;X低位加Y低位MOV ZL,AX ;存低位和MOV AX,XH ;X高位送AXADC AX,YH ;X高位加Y高位MOV ZH,AXA1: JMP A1CODE E NDSEND START二、计算X-Y=Z,其中X、Y、Z为BCD码。
实验程序及流程如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTX DW ? ;请在此处给X赋值Y DW ? ;请在此处给Y赋值Z DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AH,00HSAHFMOV CX,0002HLEA SI, XLEA DI, ZA1: MOV AL,[SI]SBB AL,[SI+02H]DASPUSHFAND AL,0FHPOPFMOV [DI],ALINC DIINC SILOOP A1A2: JMP A2CODE ENDSEND START三、乘法运算本实验实现十进制数的乘法,被乘数、乘数和乘积均以BCD码形式存放在内存中,实验程序及流程如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTDATA1 DB 5 DUP(?)DATA2 DB ?RESULT DB 6 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV D S,AXCALL INITMOV S I,OFFSET DATA2MOV B L,[SI]AND B L,0FHCMP B L,09HJNC E RRORMOV S I,OFFSET DATA1MOV D I,OFFSET RESULTMOV C X,0005HA1: MOV A L,[SI+04H]AND A L,0FHCMP A L,09HJNC E RRORDEC S IMUL B LAAMADD A L,[DI+05H]AAAMOV [DI+05H],ALDEC D IMOV [DI+05H],AHLOOP A1MOV C X,06HMOV S I,OFFSET RESULTDISPLAY:MOV AH,01HMOV A L,[SI]ADD A L,30HMOV [SI],ALINC SILOOP DISPLAYA2: JMP A2INIT: MOV SI,OFFSET RESULTMOV C X,0003HMOV A X,0000HA3: MOV [SI],AXINC SIINC SILOOP A3RETERROR: MOV A X,0145HJMP A2CODE ENDSEND START。
(完整版)8086汇编经典例程,推荐文档
sub bl,26 mov al,'a' add al,bl
MOV CX,00H WAIT1: LOOP WAIT1
;延时计数器 ;延时
DW 2 DUP (25*8,25*8,50*8) DW 12 DUP (25*8),100*8
jmp next40
DEC DX
next24: sub bl,52
==========================================
MAIN ENDP
MOV AX,[SI]
5. 编写一个数组排序(从小到大)的小程序,数组在程
序中定义,程序先将原数组显示一遍,然后排序,再
DISP PROC
将排好序的数组显示一遍。
PUSH SI
==========================================
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100 DW 2 DUP(50,50,25,25),100 DW 3 DUP(50,25,25),100
crlf proc push ax push dx
音演奏歌曲 ========================================== ;这是一个音乐程序,按大写字母“A”,唱乐曲“玛丽
ccc segment assume cs:ccc,ds:qqq
main proc far start: mov ax,qqq
mov ds,ax
next3:
jmp next10 cmp al,'a' jnae next4 cmp al,'z' ja next4 sub al,'a'
四章节8086汇编语言程序设计
一、汇编语言程序设计基本步骤 1. 分析问题,确定模型 2. 确定算法 3. 绘制流程图 4. 编写程序 5. 检查和调试
二、汇编语言程序的基本结构
1、顺序结构
举例
完成 x1*x2x3 x1:byte x2:word x3 34bit
2、分支结构
举例
实现
1 x 0
y
0
x0
1 x 0
用查表法确定分支 a、对8种产品进行编号0,1,……7 b、每一个编号对应一个入口地址 proc0,proc1,……proc7 步骤: a、把入口地址放在Table开始的内存单元; b、根据key内容进行查表实现分支转移
3、循环结构
举例
例1、计算y=0+2+4+……+1998 ydxax
4.2 8086汇编中的伪指令
一、 符号定义语句
1、等值语句 格式:符号名 EQU 表达式 例: ⑴ PORT EQU 1234 ⑵ BUFF EQU PORT+58 ⑶ MEM EQU DS:[BP+20H] ⑷ COUNT EQU CX ⑸ ABC EQU AAA
2、等号语句 格式: NUM=34 …… NUM=34+1
复制操作符DUP(Duplication)可预置重复的数值 例4: ALL_ZERO DB 0,0,0,0,0 用复制操作可改为:
ALL_ZERO DB 5 DUP(0)
5、将已定义的地址存入内存单元
例5: LIT DD CYC … CYC: MOV AX , BX
三、段定义语句
1、 段定义语句格式:
2)THIS操作符 格式: THIS 类型(或属性)
例:FIRST EQU THIS BYTE SECOND DW 100 DUP (?)
8086指令系统汇编实训实例
8086指令系统实训实例一、80x86微处理器中的寄存器图1-1 80x86微处理器的基本结构寄存器标志寄存器对照表序号类别123456789EFLAG OF DF IF TF SF ZF AF PF CF DEBUG=1 OV DN EI NG ZR AC PE CY DEBUG=0NVUPDIPLNZNAPONC标志名称 设置 未设置标志名称 设置 未设置溢出 OV(溢出) NV(未溢出) 零位 ZR (为0) NZ(不等于零)方向 UP(增加) DN (减少) 辅助进位 AC (有进位)NA(无进位)中断 EI(许可) DI(禁止) 奇偶标志 PE(偶) PO(奇)符号 NG(负) PL(正) 进位 CY (有进位) NC(清除进位)累加器AH AL BH BL CL DHDLCH SP SI DI IP FLAGS CS DS SS ESBP 基址寄存器 计数寄存器 数据寄存器 堆栈指针寄存器 基址指针寄存器 源变址寄存器 目的变址寄存器 指令指针寄存器 标志寄存器 代码段寄存器 段寄存器 附加段寄存器堆栈段寄存器 数据寄存器地址指针和 变址寄存器 控制寄存器 通用寄存器数据段寄存器二、用DEBUG软件学习汇编语言DEBUG的几点规则说明:1.所有数据默认为16进制数,后缀“H”不用加;2.DEBUG命令都是一个字母,字母大小写不分,后面的参数可以用空格分开,也可以不用;命令与数字之间可以不分开,但是两个十六进制数字之间必须分开,如:L100 = L 100;100 110 ≠100110 ;3.DEBUG中的地址表示格式有如下几种:1)段寄存器:偏移量,如:cs:1002)段地址:偏移量,如:04ba:100 或4ba:1003)默认段寄存器不写,只写偏移量,如:100;4)确定地址范围可以有两种表示方式:a)段地址:起始地址的偏移量结束地址的偏移量,如:cs:100 110;b)段地址:起始地址的偏移量L(长度),如:cs:100 L10;DEBUG软件基本指令用法一览表实例:查看主板BIOS信息:①输入“D FE00:0”,回车后看到的结果就是主板BIOS的厂商信息。
8086汇编实现的五子棋小游戏
8086汇编实现的五⼦棋⼩游戏⼀、五⼦程序设计要求汇编实现五⼦棋游戏。
⾸先显⽰空⽩棋盘,让玩家选择旗⾊,⽩⼦先⾏。
进⼊游戏对弈循环只要有⼀⽅连成同⾊五⼦,即获胜。
事先写了⼀个普通的c++五⼦棋,然后将这个思路⽤汇编实现出来,代码逾500⾏,五⼦棋功能⽐较完善了,获胜逻辑什么的判断部分基本没有问题,花费了我很⼤的精⼒。
选择旗⾊,先⼿玩家即为⽩⾊,后⼿玩家为⿊⾊,分别以W,B代表⿊⽩棋⼦。
⼆、设计思路五⼦棋,⾸先需要显⽰棋盘,然后玩家输⼊落⼦坐标,⽩⽅落⼦,⿊⽅落⼦,落⼦循环,其中每次落⼦都要判断⼀次落⼦点是否已经有棋⼦了,那就需要提醒玩家重新输⼊落⼦坐标,同理玩家输⼊的坐标超出棋盘边界的时候也要提醒玩家。
落⼦的部分解决了,就得考虑获胜的判定逻辑了,每次成功的落⼦,就要对该坐标进⾏判定,我的判定获胜的⽅法是这样的,对于落⼦坐标进⾏四类判定,⼀种是横向的,⼀种是纵向的,另外两类是左上到右下,与左下到右上的,这样就涵盖了所有的获胜的情况,并且具体怎么实现?设定⼀个变量COUNT计算同⼀线上的同⾊棋⼦数⽬,COUNT初始为1。
从落⼦坐标出发,对于横向的,分两种搜索,⼀类向左搜索,遇到同类的棋⼦COUNT+1,⼀旦不是同⾊棋⼦或者是搜索到棋盘外便转到向右搜索的循环中去,每次COUNT+1后判断是否达到5,达到5了则当前落⼦⽅获胜,遇到⾮同⾊棋⼦或搜索到棋盘外跳出循环,重置COUNT为1后进⼊其它三类判定,其它三类的获胜判定与该法原理⼀致。
原理简单易懂,但是在汇编上实现起来还是遇到了不少问题的。
同时,每次有效落⼦的时候有个变量OVERFLOW需要+1,这个是计算和棋的变量,五⼦棋的棋盘是15*15⼤⼩的,当OVERFLOW达到225时还没有决出胜负,这时候便可以宣布和棋了。
⼀些实现上的问题,由于8086汇编的输⼊中断⼀次仅识别⼀个ASII字符,导致两位数的输⼊还得⼿撸,便设置了两个暂存量TI,TJ⽤于暂存输⼊,事后再赋值给真正的落⼦坐标I,J。
汇编语言程序设计实验篇(emu8086)
1.汇编语言程序设计实验篇1.1.汇编系统软件简介Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。
它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。
该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。
利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。
1.1.1创建程序 TEMPLATE程序本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。
打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。
在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。
在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。
输入全部指令后,单击按钮,保存相应的程序段。
2.EXE TEMPLATE程序本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。
打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。
在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。
在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。
EL型(8086)上机参考程序
EL型(8086)上机参考程序一、顺序程序设计与调试1、AX←(AX)×10:①使用乘法指令:地址(16进制)机器码(16进制)汇编语言ASML1100 BB0A00 MOV BX, 10 ;1103 F7E3 MUL BX ;1105 F4 L: HLT ;1106 EBFD JMP L ;②移位加法1100 8BD8 MOV BX, AX ;1102 B102 MOV CL, 2 ;1104 D3E0 SAL AX, CL ;1106 03C3 ADD AX, BX ;1108 D1E0 SAL AX, 1 ;110A F4 L1: HLT ;110B EBFD JMP L1 ;;;或者1100 8BD8 MOV BX, AX ;1102 D1E3 SAL BX, 1 ;1104 B103 MOV CL, 3 ;1106 D3E0 SAL AX, CL ;1108 03C3 ADD AX, BX ;110A F4 L2: HLT ;110B EBFD JMP L2 ;2、y=6x4+5x3+2x2+7x+8①输入:x=0~10,x存放在1200H~1201H,输出:y,存放在1202H~1204H(压缩BCD码)注:低地址中存放数值的低字节。
②算法:y=(((6x+5)x+2)x+7)x+8③参考程序地址(16进制)机器码(16进制)汇编语言ASM1100 BE0600 MOV SI, 6 ;1103 8B3E0002 MOV DI, [0200H];1107 8BC7 MOV AX, DI ;1109 F7E6 MUL SI ;110B 050500 ADD AX, 5 ;110E F7E7 MUL DI ;1110 050200 ADD AX, 2 ;1113 F7E7 MUL DI ;1115 050700 ADD AX, 7 ;1118 F7E7 MUL DI ;111A 050800 ADD AX, 8 ;111D B104 MOV CL, 4 ;111F 33D2 XOR DX, DX ;1121 BB0A00 MOV BX, 10 ;1124 F7F3 DIV BX ;1126 89160202 MOV [0202H], DX;112A 33D2 XOR DX, DX ;112C F7F3 DIV BX ;112E D3E2 SAL DX, CL ;1130 08160202 OR [0202H], DL;1134 33D2 XOR DX, DX ;1136 F7F3 DIV BX ;1138 89160302 MOV [0203H], DX;113C 33D2 XOR DX, DX ;113E F7F3 DIV BX ;1140 D3E2 SAL DX, CL ;1142 08160302 OR [0203H], DL;1146 89060402 MOV [0204H], AX;114A F4 L3: HLT ;114B EBFD JMP L3 ;二、分支程序设计与调试1、求最大公约数①输入:在1200H~1201H中存有0800H(2048D)[或者(0024H=36D)],在1202H~1203H中存有0400H(1024D)[或者(001BH=27D)] 输出:在1204H~1205H中存放最大公约数。
第4章 8086汇编语言程序设计(实例)_6h
4.7 DOS功能调用与子程序设计
子程序/系统功能调用包括入口参数,出口参数 功能号和中断调用指令。
入口参数:传递的数据(有些不需要) 出口参数:返回的数据(有些子程序没有) 功能号: 子程序编号(必须送入AH寄存器) 中断调用:中断调用(INT 21H)
33
4.7 DOS功能调用与子程序设计
……
3
DATA SEGMENT
ARRAY DW 100 DUP(?)
DATA STK
ENDS SEGMENT
PARA
等效于:LEA BX, ARRAY STA区C这K别两‘在S条T于A语C:K句’O不F可FS少ET,是否伪则指,令D,S而
DB 10 DUP(?) STK ENDS
L未EA初是始指化令。性指令,执行阶段不同
;低于,则为大写字母
;高于,则不是字母 ;将小写字母改为大写
MOV [BX] , AL
NEXT: INC BX
JMP A1
EXIT: ……
10
四、表格处理问题
简单加密问题:编程将0~9的数字明码转换为密 码,密码表(明码和密码的映射关系)如下:
0123456789 2716908345
比如,数字1587,加密后成为7043 对此类问题,无法通过确定的函数关系来描述,
;存放结果(密码)
ENDS
……
程序需要做什么样的修改呢?
DATA TAB VA1 VA2 DATA
SEGMENT
DW 2, 7, 1, 6 ,9, 0, 8, 3, 4, 5 ;密码表
DB 8, 4, 1, 7, 5
;被加密码(明码)
DB 5 DUP(?)
;存放结果(密码)
ENDS
8086-汇编语言分支程序设计
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科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汇编和32位汇编教程
第二节 8088 汇编速查手册一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里 )XLAT 字节查表转换.── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器 :源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令 (长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.第三节 8088 汇编跳转一、状态寄存器PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:1 5 1413121119 8 7 6 5 4 3 2 1 0OFDFIFTFSFZFAF PF CF条件码:①OF(Overflow Flag)溢出标志。
8086 汇编例程
汇编语言(应用)程序(80X86/Pentium)设计:乐金松广东工业大学电子与信息工程学院;This program for:R0R1-R2R3=R4R5;---------------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTR0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)DATA ENDS;define code segmentNDWSUB SEGMENT;MAIN PROC FARASSUME CS:NDWSUB,DS:DATA,SS:STACK;START: PUSH DS ;return DOS standard programMOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXMOV AX,R1SUB AX,R3MOV R5,AXMOV AX,R0SBB AX,R2MOV R4,AXRETMAIN ENDPNDWSUB ENDSEND START;This program for:R0R1+R2R3=R4R5;---------------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTR0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)DATA ENDS;define code segmentNDWADD SEGMENT;MAIN PROC FARASSUME CS:NDWADD,DS:DATA,SS:STACK;START: PUSH DS ;return DOS standard programMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV AX,R1ADD AX,R3MOV R5,AXMOV AX,R0ADC AX,R2MOV R4,AXRETMAIN ENDP ;end process NDWADD ENDS ;end segmentEND START三、无符号二进制32位乘32位,结果为64位乘法子程序;This program for:R2R3*R6R7=R4R5R6R7;----------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTBWORD EQU THIS BYTER0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)DATA ENDS;define code segmentNBMUL SEGMENT;MAIN PROC FARASSUME CS:NBMUL,DS:DATA,SS:STACK;START: PUSH DS ;return DOS standard programMOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXMOV AX,R3MUL R7 ;R3*R7=DXAXXCHG AX,R7MOV R5,DXMUL R2 ;R2*R7=DXAXADD AX,R5MOV R4,AXMOV AX,0ADC AX,DX ;DC+Cy+0 to R5MOV R5,AXMOV AX,R6MUL R3ADD AX,R4XCHG AX,R6ADC R5,DXPUSHF ;Save Cy to stack MUL R2ADD R5,AXMOV AX,0ADC DX,AX ;DX+Cy+0=DXPOPFADC DX,AXMOV R4,AXRETMAIN ENDPNBMUL ENDSEND START四、无符号二进制64位除32位,结果为32位除法子程序注意几个问题:1、判断够减或不够减的方法2、够减时的处理方法3、不够减时的处理方法4、商上1的位置和方法5、商上零的方法;This program for:R4R5R6R7/R2R3=R6R7 ;Remainder=(R4R5);---------------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTBWORD EQU THIS BYTE ;注意这条伪指令的用法 R0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)DATA ENDS;define code segmentNBDIV SEGMENT;MAIN PROC FARASSUME CS:NBDIV,DS:DATA,SS:STACK;START: PUSH DS ;return DOS standard programMOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXMOV AX,R5SUB AX,R3MOV AX,R4SBB AX,R2JNC DIV4 ;Over processMOV CX,32 ;32次循环的目的?DIV1: CLCRCL R7,1RCL R6,1RCL R5,1RCL R4,1PUSHFPOP R0 ;Store RF to R0MOV AX,R5SUB AX,R3MOV R1,AXMOV AX,R4SBB AX,R2PUSHFTEST BYTE PTR R0,01HJNZ DIV21POPFJNC DIV2JMP DIV3DIV21: POPFDIV2: MOV R4,AXMOV AX,R1MOV R5,AXINC R7DIV3: LOOP DIV1STCDIV4: RETMAIN ENDPNBDIV ENDSEND START五、10位非压缩BCD码转化成32位二进制数子程序(十翻二子程序)思考:1、结果乘10怎样乘?2、加下一位怎样加?3、将程序改成16位10进制数转换成48位二进制数,怎样修改程序?;This program for:buffer0-buffer9 BCD code convert into Binary;input=buffer0--buffer9 (10 Byte Type no compressible BCD code) ;output=R1R0 (Word Type binary);---------------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTBWORD EQU THIS BYTER0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)buffer0 DB (?)buffer1 DB (?)buffer2 DB (?)buffer3 DB (?)buffer4 DB (?)buffer5 DB (?)buffer6 DB (?)buffer7 DB (?)buffer8 DB (?)buffer9 DB (?)DATA ENDS;define code segmentDCTB SEGMENT;MAIN PROC FARASSUME CS:DCTB,DS:DATA,SS:STACK;START: PUSH DS ;return DOS standard program MOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXLEA BX,buffer9MOV R0,0MOV R1,0MOV CX,10DO_LOOP: MOV AX,R0MOV R7,10MUL R7MOV R0,AXXCHG DX,R1MOV AX,DXMUL R7ADD R1,AXMOV AL,[BX]MOV AH,0ADD R0,AXADC R1,0DEC BXLOOP DO_LOOPRETMAIN ENDPDCTB ENDSEND START六、48位二进制数转换成十进制数子程序思考:1、结果乘二怎样乘?2、加下一位怎样加?在哪里加?3、用什么方法转化成10进制,如果无调整指令该怎么做?4、将程序改成32位二进制转化成十进制数怎么转化;This program for:R5R6R7 binanry data convert into BCD;of compressible code;input=R5R6R7;output=buffer0--buffer7;---------------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTBWORD EQU THIS BYTER0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)buffer0 DB (?)buffer1 DB (?)buffer2 DB (?)buffer3 DB (?)buffer4 DB (?)buffer6 DB (?)buffer7 DB (?)DATA ENDS;define code segmentBCTD SEGMENTMAIN PROC FARASSUME CS:BCTD,DS:DATA,SS:STACKSTART: PUSH DS ;return DOS standard program MOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXMOV CX,8LEA BX,[buffer0]CLR_BUFFER: MOV BYTE PTR [BX],0INC BXLOOP CLR_BUFFERMOV CX,48DO_LOOP: CLCRCL R7,1RCL R6,1RCL R5,1MOV AL,buffer0ADC AL,ALDAAMOV buffer0,ALMOV AL,buffer1ADC AL,ALDAAMOV buffer1,ALMOV AL,buffer2ADC AL,ALDAAMOV buffer2,ALMOV AL,buffer3ADC AL,ALDAAMOV buffer3,ALMOV AL,buffer4ADC AL,ALDAAMOV AL,buffer5ADC AL,ALDAAMOV buffer5,ALMOV AL,buffer6ADC AL,ALDAAMOV buffer6,ALMOV AL,buffer7ADC AL,ALDAAMOV buffer7,ALLOOP DO_LOOPRETMAIN ENDPBCTD ENDSEND START七、键盘读入子程序功能:读入一个按键,并显示字符,,按“ESC”退出程序,其中调用字符显示程序思考: 1、如何判断有无按键按下?2、如何读取按键的键值?3、如何显示一个字符?;This program for:sample program of key input;----------------------------------------------------------------;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;------------------------------------;define data segmentDATA SEGMENTBWORD EQU THIS BYTER0 DW (?)R1 DW (?)R2 DW (?)R3 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?)ROW_REG DB (?) ;ROW*COLCOL_REG DB (?)DATA ENDS;------------------------------------;define es segmentVIDEO SEGMENT AT 0B800HWD_BUFFER LABEL WORDV_BUFF DB 25*80*2 DUP (?)VIDEO ENDS;------------------------------------;define code segmentPROGRAM SEGMENTMAIN PROC FARASSUME CS:PROGRAM,DS:DATA,SS:STACK,ES:VIDEO;START: PUSH DS ;return DOS standard program MOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXMOV AX,VIDEO ;set ESMOV ES,AXMOV ROW_REG,10MOV COL_REG,20MOV R0,0000H ;clr screenMOV R1,184FHMOV BH,0FH ;set background colorCALL CLR_SCREEN;---------------------------------------SCAN_KEY: MOV AH,1INT 16H ;Test KeyJZ SCAN_KEYYES_KEY: MOV AH,0INT 16H ;Read keyCMP AL,1BH ;test "esc=1bh" keyJNZ KEY_PROCESSJMP EXIT ;if "ESC" Key go to EXITKEY_PROCESS: MOV AH,5FH ;Set symbol colorMOV CL,COL_REG ;Set locat of symbolMOV CH,ROW_REGCALL DISPLAYINC COL_REGCMP COL_REG,61JNE KEY_PROCESS1MOV COL_REG,20INC ROW_REGCMP ROW_REG,16JNE KEY_PROCESS1MOV ROW_REG,15MOV COL_REG,60KEY_PROCESS1: MOV AH,02H ;Set arrow locationMOV DH,ROW_REGMOV DL,COL_REGMOV BH,0INT 10HJMP SCAN_KEYEXIT: MOV R0,0000HMOV R1,184FHMOV BH,0FH ;set background colorCALL CLR_SCREENRETMAIN ENDP;*************************************************************** ;bellow is a some proc near program;-----------------------------------;display a symbol;input: symbol=al ;字符的ASCII码; color=ah ;颜色属性; row=ch ;行坐标; col=cl ;列坐标;use reg:AX,BX,CXDISPLAY PROC NEAR ;address of display;buffer=row*80*2+col*2PUSH BXPUSH CXPUSH AXMOV AL,160MUL CH ;ROW*80*2(160)=AXMOV BL,CLMOV BH,0ADD BX,AXPOP AXMOV ES:[WD_BUFFER+BX],AXPOP CXPOP BXRETDISPLAY ENDP;-------------------------------------------------------------- CLR_SCREEN PROC NEAR ;清除屏幕MOV AH,06HMOV CX,R0MOV DX,R1INT 10HMOV AH,02HMOV DH,ROW_REGMOV DL,COL_REGMOV BH,0INT 10HRETCLR_SCREEN ENDP;-------------------------------------------------------------- PROGRAM ENDSEND START八、显示日期和时间程序思考:1、怎样读取日期,和时间2、怎样在屏幕上定位显示坐标?3、怎样显示日期和时间4、其中调用哪些系统程序?;This program for:display date and time;---------------------------------------------------------------- ;define stack segmentSTACK SEGMENT STACK 'STACK'DB 1024 DUP (0)STACK ENDS;define data segmentDATA SEGMENTBWORD EQU THIS BYTER0 DW (?)R1 DW (?)R2 DW (?)R4 DW (?)R5 DW (?)R6 DW (?)R7 DW (?);-------------------------------------------------- TEMP1 DW (?)TEMP2 DW (?)TEMP3 DW (?)TEMP4 DW (?);-------------------------------------------------- LED1 DB (?)LED2 DB (?)LED3 DB (?)LED4 DB (?)LED5 DB (?)LED6 DB (?)LED7 DB (?)LED8 DB (?)LED9 DB (?)LED10 DB (?)LED11 DB (?)LED12 DB (?)LED13 DB (?)LED14 DB (?)LED15 DB (?)LED16 DB (?)LED17 DB (?)LED18 DB (?)LED19 DB (?);------------------------------------YEAR_REG DB (?)MOTH_REG DB (?)DATE_REG DB (?)S_REG DB (?)M_REG DB (?)H_REG DB (?);----------------DATA ENDS;------------------------------------;define es segmentVIDEO SEGMENT AT 0B800HWD_BUFFER LABEL WORDV_BUFF DB 25*80*2 DUP (?)VIDEO ENDS;------------------------------------;define code segmentPROGRAM SEGMENT;MAIN PROC FARASSUME CS:PROGRAM,DS:DATA,SS:STACK,ES:VIDEO;START: PUSH DS ;return DOS standard program MOV AX,0PUSH AXMOV AX,DATA ;set DSMOV DS,AXMOV AX,VIDEO ;set ESMOV ES,AXMOV TEMP1,0000H ;clr screenMOV TEMP2,184FHMOV BH,0FH ;set background colorCALL CLR_SCREEN;---------------------------------------DO_WAIT: MOV AH,1INT 16H ;Test KeyJZ NO_KEYYES_KEY: MOV AH,0INT 16H ;Read keyCMP AL,1BH ;test "esc=1bh" keyJNZ NO_KEYJMP EXIT ;if "ESC" Key go to EXITNO_KEY: CALL READ_TIMECALL READ_DATECALL CONVERT_ASCIICALL DISPLAY_TIMECALL DISPLAY_DATEJMP DO_WAITEXIT: MOV TEMP1,0000HMOV TEMP2,184FHMOV BH,0FH ;set background colorCALL CLR_SCREENRETMAIN ENDP;*************************************************************** ;bellow is a some proc near program;-----------------------------------;read time;input=no;out= H_REG,M_REG,S_REG ,all data is BCD codeREAD_TIME PROC NEARMOV AH,02H ;read time,ah=02hINT 1AH ;out=ch(h),cl(m),dh(s)MOV H_REG,CHMOV M_REG,CLMOV S_REG,DHRETREAD_TIME ENDP;--------------------------------------;read date;input=on;out=YEAR_REG,MOTH_REG,DATE_REG,all data is BCD codeREAD_DATE PROC NEARMOV AH,04H ;read time,ah=02hINT 1AH ;out=ch(h),cl(m),dh(s)MOV YEAR_REG,CLMOV MOTH_REG,DHMOV DATE_REG,DLRET;------------------------------------------;convert time and data into ASCII code and store to display buffer CONVERT_ASCII PROC NEARMOV AL,H_REG ;process timeAND AL,0F0HMOV CL,4ROR AL,CLADD AL,30H ;Convert ASCIIMOV LED1,ALMOV AL,H_REGAND AL,0FHADD AL,30H ; Convert ASCIIMOV LED2,ALMOV AL,M_REGAND AL,0F0HMOV CL,4ADD AL,30H ; Convert ASCII MOV LED4,ALMOV AL,M_REGAND AL,0FHADD AL,30H ; Convert ASCII MOV LED5,ALMOV AL,S_REGAND AL,0F0HMOV CL,4ROR AL,CLADD AL,30H ; Convert ASCII MOV LED7,ALMOV AL,S_REGAND AL,0FHADD AL,30H ; Convert ASCII MOV LED8,ALMOV LED3,3AH ;set ":"MOV LED6,3AH ;set ":";----------------------------------------------------MOV AL,YEAR_REG ;process date AND AL,0F0HMOV CL,4ROR AL,CLADD AL,30H ; Convert ASCII MOV LED12,ALMOV AL,YEAR_REGAND AL,0FHADD AL,30H ; Convert ASCII MOV LED13,ALMOV AL,MOTH_REGAND AL,0F0HMOV CL,4ROR AL,CLADD AL,30H ; Convert ASCII MOV LED15,ALMOV AL,MOTH_REGAND AL,0FHADD AL,30H ; Convert ASCIIMOV LED16,ALMOV AL,DATE_REGMOV CL,4ROR AL,CLADD AL,30H ; Convert ASCIIMOV LED18,ALMOV AL,DATE_REGAND AL,0FHADD AL,30H ; Convert ASCIIMOV LED19,ALMOV LED10,32H ;"2"MOV LED11,30H ;"0"MOV LED14,2DH ;"-"MOV LED17,2DH ;"-"RETCONVERT_ASCII ENDP;-------------------------------------------------------;display a symbol;input: symbol=al; color=ah; row=ch; col=cl;use reg:AX,BX,CXDISPLAY PROC NEAR ;address of display;buffer=row*80*2+col*2PUSH BXPUSH CXPUSH AXMOV AL,160MUL CH ;ROW*80*2(160)=AXMOV BL,CLROL BL,1 ;BL*2MOV BH,0ADD BX,AXPOP AXMOV ES:[WD_BUFFER+BX],AXPOP CXPOP BXRETDISPLAY ENDP;-------------------------------------------------------------- ;display time,send led1-led8 data to screenDISPLAY_TIME PROC NEARMOV R0,8LEA BX,LED1MOV CX,0E23HDISPLAY_TIME1: MOV AL,[BX]MOV AH,1EH ;00001110B ,set symbol colorCALL DISPLAYINC CXINC BXDEC R0JNZ DISPLAY_TIME1RETDISPLAY_TIME ENDP;-------------------------------------------------------------- ;display DATE,send led10-led19 data to screenDISPLAY_DATE PROC NEARMOV R0,10LEA BX,LED10MOV CX,0922HDISPLAY_DATE1: MOV AL,[BX]MOV AH,5FH ;00001110B ,set symbol colorCALL DISPLAYINC CXINC BXDEC R0JNZ DISPLAY_DATE1RETDISPLAY_DATE ENDP;-------------------------------------------------------------- CLR_SCREEN PROC NEARMOV AH,06HMOV CX,TEMP1MOV DX,TEMP2INT 10HMOV AH,02HMOV DH,24MOV DL,80MOV BH,0INT 10HRETCLR_SCREEN ENDP;-------------------------------------------------------------- PROGRAM ENDSEND START。
微机原理实验8086汇编8253
1、产生频率200Hz的方波输出信号。
外加时钟频率为1MHz时,选择8253定时通道0。
画出电路图、按要求编写程序,在仿真环境下调试通过。
(N=5000)2、设计一个楼道延时开关电路。
通过一个按钮启动后,220VAC供电的照明灯点亮,同时20s延时启动;20s过后,照明灯灭。
延时控制信号通过一个继电器控制220VAC供电的照明灯。
外加时钟频率为1kHz,选择8253定时通道1。
画出电路图、按要求编写程序,在仿真环境下调试通过。
(N=20000)3、设计一个4位LED数码显示的十进制减法计数器。
初始值为1000,用一个按钮开关模拟计数信号,每按动一次按钮,计数器减一。
4位LED 7段数码管显示实时的计数值。
数码管选用BCD码控制的LED器件。
选择8253定时通道2。
画出电路图、按要求编写程序,在仿真环境下调试通过。
(方式0,读取计数值,通过IO接口电路发送,显示出来)代码1DA TAS SEGMENTnum_0 equ 0020hnum_1 equ 0022hnum_2 equ 0024hcontrol equ 0026h;此处输入数据段代码DA TAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXmov al,00110111Bmov dx,controlout dx,almov al,00mov dx,num_0out dx,almov al,50mov dx,num_0out dx,al;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND STARTDA TAS SEGMENTnum_0 equ 0100hnum_1 equ 0102hnum_2 equ 0104hcontrol equ 0106h;此处输入数据段代码DA TAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TAS,SS:STACKS START:MOV AX,DATASMOV DS,AXmov al,01110011Bmov dx,controlout dx,almov al,00mov dx,num_2out dx,almov al,200mov dx,num_2out dx,al;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START代码2DA TAS SEGMENTnum_0 equ 0100hnum_1 equ 0102hnum_2 equ 0104hcontrol equ 0106h;此处输入数据段代码DA TAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TAS,SS:STACKS START:MOV AX,DATASMOV DS,AXmov al,01110011Bmov dx,controlout dx,almov al,00mov dx,num_2out dx,almov al,200mov dx,num_2out dx,al;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START。
微机原理8086汇编程序设计
03
MOV指令用于将源操作数复制 到目标操作数,ADD、SUB等 指令用于执行算术运算,CMP 指令用于比较两个操作数的大 小。
算术运算类指令
01
算术运算指令用于执行加法、减法、乘法和除法等算术运算。
02
指令包括ADD、SUB、MUL、DIV等。
03
ADD指令将两个操作数相加并将结果存储在目标操作数中, SUB指令从第一个操作数中减去第二个操作数,MUL指令将 两个操作数相乘并将结果存储在目标操作数中,DIV指令将第 一个操作数除以第二个操作数并将商存储在目标操作数中。
子程序设计的特点是能够提高程序的模块化程度,便于代码重用和维护。同时,子程序可以独立于主 程序进行测试和调试,提高了程序的可靠性。但是,子程序调用会增加程序的执行时间,需要注意优 化子程序的性能。
05 汇编语言与高级语言的接 口
C语言与汇编语言的混合编程
调用约定
在C语言中调用汇编代码时,需要遵循特定 的调用约定,如参数传递方式、寄存器使用 等。
嵌入汇编
在C语言中嵌入汇编代码,可以直接在C程序中编写 汇编指令,但需要注意语法和语义的正确性。
汇编模块
将汇编代码编写成独立的汇编模块,通过外 部函数调用的方式在C程序中使用。
汇编语言在嵌入式系统中的应用
实时性控制
01
汇编语言具有直接控制硬件的能力,适用于嵌入式系统中的实
时性控制,如中断处理、定时器控制等。
02
指令包括JMP、CALL、RET等。
03
JMP指令用于无条件跳转到指定的地址执行程序,CALL指令用于调用子程序并 将返回地址压入堆栈中,RET指令用于从子程序返回并恢复原来的执行流程。
串操作类指令
第九讲 8086汇编语言程序设计(3)
•第四章 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汇编程序-将寄存器AX的高8位传送到寄存
上机作业1、编写8086汇编程序,将寄存器AX的高8位传送到寄存器BL,AX的低8位传送到寄存器DL。
CODE SEGMENTASSUME CS:CODESTART:MOV BL,AH;寄存器AX的高8位传送到寄存器BLMOV DL,AL ;AX的低8位传送到寄存器DLINT 20H ;结束CODE ENDSEND START2、将DX寄存器的内容从低位到高位顺序分成4组,且将各组数分别送到寄存器AL、BL、CL和DL。
MOV AL,0MOV BL,0MOV CL,04ADD AL,DLADD BL,DLAND AL,0FHAND BL,0F0HSHL BL,CLMOV CL,0ADD CL,DHADD DL,DHAND CL,0FHAND DL,0F0HMOV AH,CLMOV CL,4SHL DL,CLMOV CL,AH3、判断MEN单元的数据,编程将奇数存入MENA单元,将偶数存入MENB单元。
DATAS SEGMENTMEN DW 11H,12H,13H,14H,15H,16HMENA DW 5 DUP (?)MENB DW 5 DUP (?)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV CX,6MOV SI,OFFSET MENAA1: MOV BX,[SI]INC SITEST BX,0001HJZ AA2MOV MENA,BXLOOP AA1AA2:MOV MENB,BXINC SILOOP AA1MOV AH,4CHINT 21HCODES ENDSEND START4、试统计9个数中的偶数的个数,并将结果在屏幕上显示。
DATAS SEGMENTDATA DB 1,4,5,13,16,21,28,35,41;DATAS ENDSSTACKS SEGMENT;STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATASMOV DS,AXMOV CX,9MOV DX,0LEA SI,DATAPANDUAN:MOV AL,[SI]SHR AL,1JC NEXTINC DLNEXT:INC SILOOP PANDUANCMP CX,0JNZ PANDUANMOV AH,02HADD DL,30HINT 21H;MOV AH,4CHINT 21HCODES ENDSEND START5、试将一串16位无符号数加密,加密方法是将每个数乘2。
8086的汇编超级浓缩教程
“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。
”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。
)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。
三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!”对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。
所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。
某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。
为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。
但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。
大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解)因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。
8086汇编中编写无溢出除法的子程序
8086汇编中编写无溢出除法的子程序一、为什么除法会溢出看到这个标题,你可能会问汇编中不是有div指令来实现除法运算吗?为什么我们还要自己写一个子程序来实现除法?为了说明我们为什么需要自己写一个实现除法的子程序,还得从除法为什么会发生溢出说起。
在汇编中,如果要使用除法运算,我们可以使用div指令,它实现的就是除法的功能,但是它是一个非常容易,甚至说不可避免会发生溢出的指令,下面来看看它的工作方式,我们就能知道个中源由。
注:这里所说的除法溢出并不是指分母为0而发生溢出的情况。
div的工作方式:(1)除数:有8位和16位两种,在一个寄存器或内存单元中(2)被除数:默认放在AX或DX和AX中,如果除数为8位,则被除数为16位,默认在AX中存放;如果除数为16位,被除数为32位,在DX 和AX中存放,DX存放高16位,AX存放低16位(3)结果:如果除数为8位,则AL(AX的低8位)存储除法操作的商,AH(AX的高8位)存储除法操作的余数;如果除数为16们,则AX存储除法操作的商,DX存放除法操作的余数。
数都用32位,所有的除数都用16位,所有的商都用32位,所有的余数都用16位来保存,就可以解决这个问题,因为一个数除以一个整数后,不可能大于其之前的值。
而对于8位的除法,除数和被除数的高位全用0补全即可。
为了达到这个目的,我们就不能使用默认的除法指令div了,而需要我们写代码来实现我们自定义的除法。
考虑到除法是一个常用的操作,所以我们可以编写一个子程序来实现除法,在进行除法运算时,直接调用我们自己定义的子程序来完成任务,而不直接使用div指令。
三、如何实现这个功能要实现除法还得使用div指令,只是我们可以做一些特殊的处理,让我们自定义的除法不发生溢出,因为我们使用的是除数为16位的除法,也就是说,我们只要能保证除法的商不大于65535就不会发生问题。
为了实现这个功能,我们首先要知道一个关于除法的公式(H表示X的高位,L表示X的低位):X/N = int(H/N)* 2^16 + [rem(H/N)* 2^16+L]/N这个公式告诉我们32位的被除数与16位的除数,可以拆分为两个除数和被除数都为16位的数的除法,然后通过加法来得到同样的结果,这个是非常重要的。
8086-汇编指令集
8086 汇编指令集一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令MOV 传送字或字节.格式为: MOV DST,SRC执行的操作:(DST)<-(SRC)MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.格式为:PUSH SRC执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC)POP 把字弹出堆栈.格式为:POP DST执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX 依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX 依次弹出堆栈.BSWAP 交换32 位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)2. 输入输出端口传送指令.IN I/O 端口输入. ( 语法: IN 累加器,{端口号│DX} )长格式为:IN AL,PORT(字节)IN AX,PORT(字)执行的操作:(AL)<-(PORT)(字节)(AX)<-(PORT+1,PORT)(字)短格式为:IN AL,DX(字节)IN AX,DX(字)执行的操作: AL<-((DX))(字节)AX<-((DX)+1,DX)(字)OUT I/O 端口输出. ( 语法: OUT {端口号│DX},累加器),输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX 指定时,其范围是0-65535.长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)XLAT 换码指令字节查表转换,BX 指向一张256 字节的表的起点,AL 为表的索引值(0-255,即0-FFH);返回AL 为查表结果. 执行的操作: ( [BX+AL]->AL )格式为: XLAT OPR或: XLAT3. 目的地址传送指令.LEA 装入有效地址. 格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.格式为: LDS REG,SRC执行的操作:(REG)<-(SRC) (DS)<-(SRC+2)把源操作数指定的 4 个相继字节送到由指令指定的寄存器及DS 寄存器中.该指令常指定SI寄存器.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.格式为: LES REG,SRC执行的操作: (REG)<-(SRC) (ES)<-(SRC+2)把源操作数指定的 4 个相继字节送到由指令指定的寄存器及ES 寄存器中.该指令常指定DI寄存器.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.格式为: LAHF执行的操作:(AH)<-(PWS 的低字节)SAHF 标志寄存器传送,把AH 内容装入标志寄存器.格式为: SAHF执行的操作:(PWS 的低字节)<-(AH)PUSHF 标志入栈.格式为: PUSHF执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)POPF 标志出栈.格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP)) (SP)<-(SP+2)PUSHD 32 位标志入栈.POPD 32 位标志出栈.二、算术运算指令ADD 加法.格式: ADD DST,SRC执行的操作:(DST)<-(SRC)+(DST)ADC 带进位加法.格式: ADC DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CFINC 加1.格式: INC OPR执行的操作:(OPR)<-(OPR)+1AAA 加法的ASCII 码调整.DAA 加法的十进制调整.SUB 减法.格式: SUB DST,SRC执行的操作:(DST)<-(DST)-(SRC)SBB 带借位减法.格式: SBB DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CFDEC 减1.格式: DEC OPR执行的操作:(OPR)<-(OPR)-1NEC 求反(以0 减之).格式: NEG OPR执行的操作:(OPR)<--(OPR)CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB 指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志. AAS 减法的ASCII 码调整.DAS 减法的十进制调整.MUL 无符号乘法.格式: MUL SRC执行的操作:字节操作数:(AX)<-(AL)*(SRC)字操作数:(DX,AX)<-(AX)*(SRC)IMUL 整数乘法.格式: IMUL SRC执行的操作:与MUL 相同,但必须是带符号数,而MUL 是无符号数.以上两条,结果回送AH 和AL(字节运算),或DX 和AX(字运算),AAM 乘法的ASCII 码调整.DIV 无符号除法.非组合BCD 码乘法调整指令格式: DIV SRC执行的操作:字节操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数字操作: (AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数IDIV 整数除法.格式: DIV SRC执行的操作:与DIV 相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同.以上两条,结果回送:商回送AL,余数回送AH,(字节运算);或商回送AX,余数回送DX,(字运算).AAD 除法的ASCII 码调整.非组合BCD 码除法调整指令CBW 字节转换为字. (把AL 中字节的符号扩展到AH 中去)格式: CBW执行的操作:AL 的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFHCWD 字转换为双字. (把AX 中的字的符号扩展到DX 中去)格式: CWD执行的操作:AX 的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.CWDE 字转换为双字. (把AX 中的字符号扩展到EAX 中去)CDQ 双字扩展. (把EAX 中的字的符号扩展到EDX 中去)三、逻辑运算指令AND 与运算.格式: AND DST,SRC执行的操作:(DST)<-(DST)^(SRC)OR 或运算.格式: OR DST,SRC执行的操作:(DST)<-(DST)V(SRC)XOR 异或运算.格式: XOR DST,SRC执行的操作:(DST)<-(DST)V(SRC)NOT 取反.格式: NOT OPR执行的操作:(OPR)<-(OPR)TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码SHL 逻辑左移.格式: SHL OPR,CNT(其余的类似)其中OPR 可以是除立即数以外的任何寻址方式.移位次数由CNT 决定,CNT 可以是 1 或CL.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255 次.移位一次时,可直接用操作码. 如SHL AX,1.移位>1 次时,则由寄存器CL 给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D 标志0 表示重复操作中SI 和DI 应自动增量;1 表示应自动减量.Z 标志用来控制扫描或比较操作的结束.MOVS 串传送.格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1当方向标志DF=0 时用+,当方向标志DF=1 时用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0 时用+,当方向标志DF=1 时用-该指令不影响条件码.CMPS 串比较.格式: CMPS SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS 指令的规定相同.SCAS 串扫描.把AL 或AX 的内容与目标串作比较,比较结果反映在标志位.格式: SCAS DSTSCASBSCASW执行的操作:字节操作: (AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS 的规定相同.LODS 装入串.把源串中的元素(字或字节)逐一装入AL 或AX 中.格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL 或AX 中,并根据方向标志及数据类型修改SI 的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP 联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.STOS 保存串.是LODS 的逆过程.格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL 或AX 的内容存入由(DI)指定的附加段的某单元中,并根据DF 的值及数据类型修改DI 的内容,当它与REP 联用时,可把AL 或AX 的内容存入一个长度为(CX)的缓冲区中.REP 当CX/ECX<>0 时重复.格式: REP string primitive其中String Primitive 可为MOVS,LODS 或STOS 指令执行的操作:1)如(CX)=0 则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3)REPE/REPZ 当ZF=1 或比较结果相等,且CX/ECX<>0 时重复.格式: REPE(或REPZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令.执行的操作:1)如(CX)=0 或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3)REPNE/REPNZ 当ZF=0 或比较结果不相等,且CX/ECX<>0 时重复.格式: REPNE(或REPNZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令执行的操作:除退出条件(CX=0)或ZF=1 外,其他操作与REPE 完全相同.REPC 当CF=1 且CX/ECX<>0 时重复.REPNC 当CF=0 且CX/ECX<>0 时重复.五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)<-(IP)+8 位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)<-(IP)+16 位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)<-OPR 的段内偏移地址(CS)<-OPR 所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR执行的操作:(IP)<-(EA) (CS)<-(EA+2)2>条件转移指令(短转移,-128 到+127 的距离内)1)根据单个条件标志的设置情况转移JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR测试条件:ZF=1JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR测试条件:ZF=0JS(Jump if sign) 结果为负则转移格式: JS OPR测试条件:SF=1JNS(Jump if not sign) 结果为正则转移格式:JNS OPR测试条件:SF=0JO(Jump if overflow) 溢出则转移格式: JO OPR测试条件:OF=1JNO(Jump if not overflow) 不溢出则转移格式: JNO OPR测试条件:OF=0JP(或JPE)(Jump if parity,or parity even) 奇偶位为1 则转移格式: JP OPR测试条件:PF=1JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0 则转移格式: JNP(或JPO) OPR测试条件:PF=0JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1 则转移格式:JB(或JNAE,JC) OPR测试条件:CF=1JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0 则转移格式:JNB(或JAE,JNC) OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移JB(或JNAE,JC)格式:同上JNB(或JAE,JNC)格式:同上JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR测试条件:CFVZF=1JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR测试条件:SFVOF=1JNL(或JGE)(Jump if not less,or greater or equal)不小于, 或者大于或者等于则转移格式:JNL(或JGE) OPR测试条件:SFVOF=0JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR测试条件:(SFVOF)VZF=1JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR测试条件:(SFVOF)VZF=04)测试CX 的值为0 则转移指令JCXZ(Jump if CX register is zero) CX 寄存器的内容为零则转移格式:JCXZ OPR测试条件:(CX)=0注:条件转移全为8 位短跳!3>循环控制指令(短转移)LOOP CX 不为零时循环.格式: LOOP OPR测试条件:(CX)<>0LOOPE/LOOPZ CX 不为零且标志Z=1 时循环.格式: LOOPZ(或LOOPE) OPR测试条件:(CX)<>0 且ZF=1LOOPNE/LOOPNZ CX 不为零且标志Z=0 时循环.格式: LOOPNZ(或LOOPNE) OPR测试条件:(CX)<>0 且ZF=0这三条指令的步骤是:1)(CX)<-(CX)-12)检查是否满足测试条件,如满足则(IP)<-(IP)+D8 的符号扩充.JCXZ CX 为零时转移.JECXZ ECX 为零时转移.4>子程序CALL 调用指令RET 返回指令5>中断指令INT 中断指令格式: INT TYPE或INT执行的操作: (SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2 ((SP)+1,(SP))<-(CS)(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP)(IP)<-(TYPE*4) (CS)<-(TYPE*4+2)INTO 溢出中断执行的操作:若OF=1 则:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2 ((SP)+1,(SP))<-(CS)(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP)(IP)<-(10H) (CS)<-(12H)IRET 中断返回格式: IRET执行的操作: (IP)<-((SP)+1,(SP))(SP)<-(SP)+2(CS)<-((SP)+1,(SP))(SP)<-(SP)+2(PSW)<-((SP)+1,(SP))(SP)<-(SP)+2六、处理器控制指令1.标志处理指令CLC 进位位置0 指令(Clear carry)CF<-0CMC 进位位求反指令(Complement carry)CF<-CFSTC 进位位置1 指令(Set carry)CF<-1CLD 方向标志置0 指令(Clear direction)DF<-0STD 方向标志置1 指令(Set direction)DF<-1CLI 中断标志置0 指令(Clear interrupt)IF<-0STI 中断标志置1 指令(Set interrupt)IF<-02.其他处理机控制指令NOP 无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.HLT 停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.WAIT 等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT 指令继续德行.ESC 换码指令格式ESC mem其中mem 指出一个存储单元,ESC 指令把该存储单元的内容送到数据总线去.当然ESC 指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.LOCK 封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU 与其他处理机协同工作时,该指令可避免破坏有用信息.七、伪指令DW 定义字(2 字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
==========================================5.编写一个数组排序(从小到大)的小程序,数组在程序中定义,程序先将原数组显示一遍,然后排序,再将排好序的数组显示一遍。
==========================================AAA SEGMENTBUF DB '45$'L = $ - BUFary dw -897,345,6789,8654,-1234,-3456,-99,-678,987,567,32762,-12121,0,3434,4645,-234,23455,-100,100,1000,-1000dw 572,-2345,-6543,-1234,9999|len dw ($-ary)/2ASSUME CS:AAA, DS:AAAMAIN PROC FARPUSH CSPOP DSLEA SI,ARYMOV CX,LENNEXT3: MOV BX,[SI]CALL DISPCALL SPACE-ADD SI,2LOOP NEXT3CALL CRLFCALL CRLFLEA SI,ARYMOV CX,LENCALL SORTLEA SI,ARYMOV CX,LENNEXT5: MOV BX,[SI]CALL DISP…CALL SPACEADD SI,2LOOP NEXT5MOV AH,4CHINT 21HMAIN ENDPDISP PROCPUSH SIPUSH AXPUSH BX!PUSH DXPUSH CXMOV CX,0CMP BX,0JNL NEXT1NEG BXMOV CX,1NEXT1: LEA SI,BUF+l-1MOV AX,BXMOV BX,10NEXT: MOV DX,0}DIV BXADD DL,30HDEC SIMOV [SI],DLCMP AX,0JNE NEXTCMP CX,0JE NEXT2DEC SIMOV BYTE PTR [SI],'-'NEXT2: MOV DX,SI!MOV AH,9INT 21HPOP CXPOP DXPOP BXPOP AXPOP SIRETDISP ENDPSORT PROC(NEXTT: PUSH CXMOV DI,SIMOV AX,[SI]NEXT0: CMP AX,[DI]JL NEXTQMOV BX,AXMOV AX,[DI]MOV [DI],BXNEXTQ: ADD DI,2LOOP NEXT0MOV [SI],AX…ADD SI,2POP CXLOOP NEXTTRETSORT ENDPCRLF PROCPUSH AXPUSH DXMOV DL,13MOV AH,2|INT 21H MOV DL,10 INT 21H POP DXPOP AXRET CRLF ENDPSPACE PROCPUSH AXPUSH DX】MOV DL,' 'MOV AH,2INT 21HPOP DXPOP AXRETSPACE ENDPAAA ENDSEND MAIN===============================================6.!7.编写一个程序,从键盘输入10个十进制数字字符,然后将这些数字加密存储在缓冲区BUFFER中。
加解密表如下:==========================================qqq segmentTAB1 DB 'QWERTYUIOPASDFGHJKLZXCVBNM'TAB2 DB 'qazwsxedcrfvtgbyhnujmikolp'TAB3 DB ')(*&^%/#@!'LEN = $-tab1MSS1 DB 13,10,'Please chose afunctioc:',0DH,0AHDB ' 1--jiami ',0DH,0AHDB ' 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 endsccc segmentassume cs:ccc,ds:qqqmain proc far;start: mov ax,qqqmov ds,axrep1: call crlfLEA SI,BUF1LEA DI,BUF2lea dx,mss1 ;显示菜单mov ah,9int 21hmov ah,1 ;输入你的选项int 21h#cmp al,'0' ;输入0,结束je quitcmp al,'1' ;输入1,加密je jiamicmp al,'2' ;输入2,解密je jiemimov [mss2+25],al ;其他字符,错误,重输入lea dx,mss2mov ah,9int 21hjmp rep1#quit: mov ah,4chint 21hjiami: call crlfnext1: mov ah,1int 21hcmp al,27je NEXT14MOV [SI],ALcmp al,'A'jnae next3]cmp al,'Z'ja next3sub al,'A'lea bx,tab1jmp next10next3: cmp al,'a'jnae next4cmp al,'z'ja next4sub al,'a'lea bx,tab2·jmp next10next4: cmp al,'0'jb next13cmp al,'9'ja next13lea bx,tab3sub al,'0'next10: xlatnext13: MOV [DI],ALINC SIINC DI:jmp next1next14: MOV BYTE PTR [SI],24H MOV BYTE PTR [DI],24HCALL CRLFLEA DX,MM1MOV AH,9INT 21HCALL CRLFLEA DX,MM2INT 21HJMP REP1~jiemi: call crlf next18: mov ah,1int 21hcmp al,27je NEXT14MOV [SI],ALmov bx,0next20: cmp al,tab1[bx]je next22inc bx、cmp bx,62jb next20jmp next40next22: cmp bx,26jae next23mov al,'A'add al,bljmp next40next23: cmp bx,52jae next24sub bl,26—mov al,'a'add al,bljmp next40next24: sub bl,52mov al,'0'add al,blnext40: MOV [DI],ALINC SIINC DIjmp next18main endp]crlf procpush axpush dxmov ah,2mov dl,13int 21hmov dl,10int 21hpop dxpop ax。
retcrlf endpccc endsend start==========================================8.编写一个发声的小程序,通过程序使PC喇叭发出声音==========================================PROG SEGMENTMAIN PROC FARASSUME CS:PROG,DS:PROG…START: MOV DX,0000 ;计产生"1","0"次数IN AL,61H ;取得设备控制字AND AL,0FCH ;使AL最低两位为"0"CHANG: XOR AL,3 ;改变输出值OUT 61H,AL;输出到61H端口,扬声器发声MOV CX,00H ;延时计数器WAIT1: LOOP WAIT1 ;延时DEC DXJNE CHANGMOV AH,4CH-INT 21H ;返回系统PROG ENDSEND START==========================================9.编写一个唱歌的小程序,通过程序使PC喇叭发出声音演奏歌曲==========================================;这是一个音乐程序,按大写字母“A”,唱乐曲“玛丽有只小羔羊”;;按大写字母“B”,唱乐曲“太湖船”;按大写字母“C”,唱乐曲“祝福歌”;按"Q"鍵,退出—DATA SEGMENT PARA 'DATA'INFO1 DB 0DH,0AH,'WELCOME TO COME HERE!$'INFO2 DB 0DH,0AH,'this is a music program!$' INFO3 DB 0DH,0AH,'please select!$'INFO4 DB 0DH,0AH,'INPUT ERROR!$'INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'MUSLIST DB 0DH,0AH,'A MUSIC1'DB 0DH,0AH,'B MUSIC2'DB 0DH,0AH,'C MUSIC3'?DB 0DH,0AH,'Q EXIT'DB 0DH,0AH,'$'MUS_FREG1 DW 330,294,262,294,3 DUP (330)DW 3 DUP (294),330,392,392DW 330,294,262,294,4 DUP (330) DW 294,294,330,294,262,-1 MUS_TIME1 DW 6 DUP (25*8),50*8DW 2 DUP (25*8,25*8,50*8)DW 12 DUP (25*8),100*8—MUS_FREG2 DW 330,392,330,294,330,392,330,294,330DW 330,392,330,294,262,294,330,392,294DW 262,262,220,196,196,220,262,294,332,262,-1MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100DW 2 DUP(50,50,25,25),100DW 3 DUP(50,25,25),100:MUS_FREG3 DW 262,262,294,262,349DW 330,262,262,294,262DW 392,349,262,262,523DW 440,349,262,262,466DW 466,440,262,392,349,-1MUS_TIME3 DW 50,50,100,100,100DW 100,100,50,50,100,100DW 100,100,100,50,50,100DW 100,100,100,100,100,50DW 50,100,100,100,100,100{DATA ENDSSTACK SEGMENT PARA STACK 'STACK'DB 200 DUP ('STACK')STACK ENDS;*****定义一个宏*****SHOW MACRO bLEA DX,bMOV AH,9、INT 21HENDM;**********************CODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODEMAIN PROC FARMOV AX,DATAMOV DS,AXMOV AH, 0 ;0号功能MOV AL,4 ;显示方式号4放在-;AL中320*200四色图形INT 10H ;显示器输出控制中断调用MOV AH,0BH ;置彩色调色板MOV BH,0MOV BL,1 ;BH=0,BL=4,背景色为红色INT 10H ;显示器输出控制中断调用MOV AH,0BHMOV BH,01HMOV BL,00INT 10H ;显示器输出控制中断调用show INFO1;show INFO2show INFO3show MUSLISTINPUT: MOV AH,01HINT 21HCMP AL,'Q'JZ retuCMP AL,'A'JNZ B0LEA SI,MUS_FREG1LEA BP,DS:MUS_TIME1~CALL MUSICJMP EXIT1B0: CMP AL,'B'JNZ C0LEA SI,MUS_FREG2LEA BP,DS:MUS_TIME2 CALL MUSICJMP EXIT1C0: CMP AL,'C'JNZ exitLEA SI,MUS_FREG2…LEA BP,DS:MUS_TIME2 CALL MUSICEXIT1: show INFO5JMP INPUTEXIT: call clearshow INFO4show INFO5show INFO1show INFO2show INFO3show MUSLIST%jmp inputRETU: MOV AH,4CHINT 21HMAIN ENDPMUSIC PROC NEARFREG1: MOV DI,[SI]CMP DI,-1JE END_MUS1MOV DX,DS:[BP]MOV BX,1400*CALL GENSOUNDADD SI,2ADD BP,2JMP FREG1END_MUS1: RETMUSIC ENDPGENSOUND PROC NEARPUSH AXPUSH BXPUSH CX|PUSH DXPUSH DIMOV AL,0B6HOUT 43H,ALMOV DX,12HMOV AX,533H*896DIV DIOUT 42H,ALMOV AL,AHOUT 42H,ALIN AL,61H}MOV AH,ALOR AL,3OUT 61H,ALWAIT1: MOV CX,8FF0HDELAY1: LOOP DELAY1DEC BXJNZ WAIT1MOV AL,AHOUT 61H,ALPOP DIPOP DX:POP CXPOP BXPOP AXRETGENSOUND ENDPclear proc nearpush axpush bxpush cxpush dx$mov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79mov bh,7int 10hpop dxpop cxpop bx{pop axretclear endpCODE ENDSEND MAIN==========================================10.编写一个通过键盘输入你的名字,然后在屏幕上显示,“hello, 你的名字!”的程序。