8086汇编经典例程下
简单的8086汇编程序(已加入详细注释)一位数加减乘除运算

简单的8086汇编程序(已加入详细注释)一位数加减乘除运算;波波安注释;注意分支结构,理清程序思路,一般出现CMP、JE等的地方都是分支。
;字体设置不同可能会出现编排结构混乱,我使用的字体是Times New Roman,常规,小二,大写DISPC MACRO CHAR;宏定义MOV DL,CHARMOV AH,2INT 21HENDMDATA SEGMENT;数据段S DB 'Please input data:$'X DB 0Y DB 0C DB 0Z DB 0,0DATA ENDSCODE SEGMENT;代码段ASSUME CS:CODE,DS:DATA,SS:DATA;说明;代码段开始START: MOV AX,DATAMOV DS,AX;输入第一个数L1: LEA DX,S;传送字符串的偏移地址MOV AH,9;显示字符串INT 21HCALL INPUT;调用子函数MOV X,AL;第一个数据输入成功,存入X;输入运算符L2: MOV AH,1INT 21H ;键盘输入并回显;分支CMP AL,'+'JE L3;相等,则跳转。
即若输入为“+”则跳转CMP AL,'-'JE L3CMP AL,'*'JE L3CMP AL,'/'JE L3DISPC 8;输入错误,执行错误处理DISPC 20HDISPC 8JMP L2;跳转回L2继续输入L3: MOV C,AL;运算符存入CCALL INPUT;接着输入第二个数MOV Y,AL;第二个数存入YDISPC '=';显示“=”;运算符判断;分支CMP C,'+';判断是否为“+”JNE L4;不等,则跳转。
即不为“+”则跳转L4MOV AL,X;为“+”,则执行加法操作。
算术运算中目的操作数一般为寄存器(AX)。
ADD AL,YMOV Z,AL;结果存入ZJMP L9;转到L9,显示结果L4: CMP C,'-';判断是否为“-”JNE L6;不等,则跳转,继续判断MOV AL,X;为“-”,则执行减法操作SUB AL,YMOV Z,AL;结果存入ZCMP Z,0;比较结果是否小于0JGE L5;不小于0,转到L9,直接显示。
常用汇编语言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。
[汇编]8086指令系统---算术指令(二)
![[汇编]8086指令系统---算术指令(二)](https://img.taocdn.com/s3/m/2a1454edd5bbfd0a78567304.png)
[汇编]8086指令系统---算术指令(二)4 除法指令DIV src无符号数除法(unsigned divide)IDIV src带符号数除法(signed divide)字节操作: (AL) ← (AX) / src 的商(AH) ← (AX) / src 的余数字操作: (AX) ← (DX, AX) / src 的商(DX) ← (DX, AX) / src 的余数参加运算的除数和被除数是无符号数时,使用DIV指令,其商和余数也均为无符号数。
IDIV指令执行的操作与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,而且余数的符号与被除数的符号相同。
这两条除法指令的被除数必须存放在AX或DX,AX中,源操作数src作为除数,可用除立即数以外的任一种寻址方式来取得。
除法指令对所有条件码均无定义,因此对除法指令产生的错误,如除数为0或商溢出等错误,程序员都不能用条件码进行判断,而是由系统直接转入0型中断来处理。
所谓商溢出,是指被除数高一半的绝对值大于除数的绝对值时,商超出了16位的表示范围(字操作)或8位的表示范围(字节操作)。
由于使用除法指令的需要,经常要将字节数据扩展为字数据,或者将字数据扩展为双字数据,所以我们先介绍下面的符号扩展指令,然后再对除法指令举例。
3.3.2.5 符号扩展指令CBW字节扩展为字(convert byte to word)执行操作:(AH)= 00H 当(AL)的最高有效位为0时(AH)= FFH 当(AL)的最高有效位为1时CWD字扩展为双字(convert word to double word)执行操作:(DX)=0000H当(AX)的最高有效位为0时(AH)=FFFFH当(AX)的最高有效位为1时这是两条无操作数指令,进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中。
这两条符号扩展指令都不影响条件码。
注意:除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位的;字节操作时,被除数必须为16位,除数是8位,得到的商和余数是8位的。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.编写一个程序,从键盘输入任意十进制正数,然后将这个数按16进制形式显示在屏幕上。
DECIHEX SEGMENT ; 定义代码段
ASSUME CS:DECIHEX
MAIN PROC FAR ; 主程序
REPEAT: CALL DECIBIN ; 调用子程序输入十进制数
CALL CRLF ; 显示回车、换行
CALL BINIHEX ; 以十六进制数输出
CALL CRLF ; 显示回车、换行
JMP REPEAT ; 转REPEA T,继续
MAIN ENDP
DECIBIN PROC NEAR ; 十进制数输入子程序
MOV BX, 0 ; BX保存输入数
NEWCHAR: MOV AH, 1
INT 21H ; 调用DOS功能输入字符
SUB AL, 30H ; 转为数0-9
JB EXIT ; 小于0,不是数字
CMP AL, 9D ; 与9比较
JA EXIT ; 大于,不是数字
CBW ; AL=>AX
XCHG AX, BX ; AX、BX互换
MOV CX, 10D ; CX=10
MUL CX ; AX=AX*CX
ADD BX, AX ; BX为前面输入的结果
JMP NEWCHAR
EXIT: RET
DECIBIN ENDP
BINIHEX PROC NEAR
MOV CH, 4 ; CH循环次数
ROTA TE: MOV CL, 4 ;每次循环输出一位十六进制数
ROL BX, CL ; 即移位4个二进制位
MOV AL, BL ; AL=BL
AND AL, 0FH ; 取低4位
ADD AL, 30H ; 转变为ASCII码
CMP AL, 3AH ; 是否为’0’-‘9’
JL PRINTIT ; 是转PRINTIT
ADD AL, 7H ; 否转为’A’-‘F’
PRINTIT: MOV DL, AL ; DL=输出字符
MOV AH, 2
INT 21H ;调用DOS中断,显示字符
DEC CH
JNZ ROTA TE ; 没循环结束,继续
RET ; 返回
BINIHEX ENDP
CRLF PROC NEAR ; 输出回车、换行
MOV DL, 0DH
MOV AH, 2
INT 21H ; 输出回车
MOV DL, 0AH
MOV AH, 2
INT 21H ; 输出换行
RET
CRLF ENDP
DECIHEX ENDS
END MAIN
================================================================= 2.编写一个程序,从键盘输入任意一串字符,然后将这个字符串中的所有小写字母替换成大写字母(其他字母不做修改),并显示在屏幕上。
data segment
keynum = 255
keybuf db keynum
db 0
db keynum dup(0)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset keybuf
mov ah,0ah
int 21h
mov dl,0ah
mov ah,2
int 21h
mov bx,offset keybuf+1
mov cl,[bx]
mov ch,0
again: inc bx
mov dl,[bx]
cmp dl,'a'
jb disp
cmp dl,'z'
ja disp
sub dl,20h
disp: mov ah,2
int 21h
loop again
mov ax,4c00h
int 21h
code ends
end start
========================================== =======================
3.编写一个小程序,测试给定的一个8位数,从最低位开始,那一位为“1”,显示该位的位号。
例如:如果给定数据为78H,则显示3,若给定数据为80H,则显示7。
data segment
number db 78h
addrs dw fun0, fun1, fun2, fun3
dw fun4, fun5, fun6, fun7
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov al,number
mov dl,'?'
cmp al,0
jz disp
mov bx,0
again: shr al,1
jc next
inc bx
jmp again
next: shl bx,1
jmp addrs[bx]
fun0: mov dl,'0'
jmp disp
fun1: mov dl,'1'
jmp disp
fun2: mov dl,'2'
jmp disp
fun3: mov dl,'3'
jmp disp
fun4: mov dl,'4'
jmp disp
fun5: mov dl,'5'
jmp disp
fun6: mov dl,'6'
jmp disp
fun7: mov dl,'7'
jmp disp
disp: mov ah,2
int 21h
mov ax,4c00h
int 21h
code ends
end start
==========================================
=======================
4. 编写一个小程序,任意从键盘输入一个字符,用二进
制数显示该字符的ASCII。
例如:如果输入的是“A”,则显示01000001,若输入的
是“7”,则显示00110111
code segment
assume cs:code
start:
mov ah,1
int 21h
mov bl,al
mov ah,2
mov dl,'='
int 21h
mov cx,8
again: shl bl,1
mov dl,0
adc dl,30h
mov ah,2
int 21h
loop again
mov ax,4c00h
int 21h
code ends
end start。