8086指令系统汇编实训实例

更新时间:2024-06-23 02:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

8086指令系统实训实例

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

AH BH CH DH SP BP SI DI IP FLAGS CS DS SS ES AL BL CL DL 累加器基址寄存器 计数寄存器 数据寄存器 堆栈指针寄存器 基址指针寄存器 源变址寄存器 目的变址寄存器 指令指针寄存器 标志寄存器 代码段寄存器 数据段寄存器 堆栈段寄存器 附加段寄存器

段寄存器 控制寄存器 地址指针和 变址寄存器 数据寄存器

通用寄存器

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

标志寄存器对照表

序号 类别 1 OF OV NV 2 DF DN UP 3 IF EI DI 4 TF 5 SF NG PL 6 ZF ZR NZ 7 AF AC NA 8 PF PE PO 9 CF CY NC EFLAG DEBUG=1 DEBUG=0 标志名称 设置 未设置 标志名称 设置 未设置 溢出 OV(溢出) NV(未溢出) 零位 ZR(为0) NZ(不等于零) 方向 UP(增加) DN (减少) 辅助进位 AC(有进位)NA(无进位) 中断 EI(许可) DI(禁止) 奇偶标志 PE(偶) PO(奇) 符号 NG(负) PL(正) 进位 CY (有进位) NC(清除进位)

1

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

? DEBUG的几点规则说明:

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

2. DEBUG命令都是一个字母,字母大小写不分,后面的参数可以用空格分开,也可以不用;命令与数字之间可以不分开,但是两个十六进制数字之间必须分开,如:

L100 = L 100;100 110 ≠ 100110 ; 3. DEBUG中的地址表示格式有如下几种: 1) 段寄存器:偏移量,如:cs:100

2) 段地址:偏移量,如:04ba:100 或4ba:100 3) 默认段寄存器不写,只写偏移量,如:100; 4) 确定地址范围可以有两种表示方式:

a) 段地址:起始地址的偏移量 结束地址的偏移量,如:cs:100 110; b) 段地址:起始地址的偏移量 L(长度),如:cs:100 L10;

DEBUG软件基本指令用法一览表

指格式 令 A A [首地址] C 功能 备注 编译汇编语言指令 A 100 C [区段1] [区段长度] [区段将两块内存作比较 C 100 L20 200 2] D 100 L20 E 100 F 100 L10 90 2

D D [地址] [长度]& [地址范围] 显示内存的内容 E E [地址] 空格键编辑下一个 编辑内存内容 F F [地址] [长度] [内容]

填充指定内存区块内容 G G =[地址] [断点1] [断点2] 带有任选断点执行 G=100 ?? H H [数1] [数2] I I [端口地址] 十六进制数加减 读/显示输入字节 H 44 33 I 70 L 100 2 1 2 M 100 L10 110 N bb.com O 70 19 Q R AX S 100 L70 'j' T U 100 默认32字节 L L [地址]或[磁碟,磁轨,扇区] 装入文件或磁区 M M [原地址] [长度] [目标地址] 传送内存区块 N N [文件名] O O [端口位址] Q Q R R [寄存器] S S [地址] [长度] ‘参数’ T T [=地址]或[指令条数] U U [地址] [指令长度] W W [地址]或[指定BX、CX范围] 定义文件名 输出字节到端口 退出DEBUG界面 显示修改寄存器 对字符进行检索 单步追踪 反汇编 写入文件,默认写入 W 200 CS:100

实例: 查看主板BIOS信息:

① 输入“D FE00:0”,回车后看到的结果就是主板BIOS的厂商信息。

② 接着再输入“D FFFF:5 L 8”,回车后,主板的BIOS版本日期也出来了。

三、ASCII码与BCD编码

ASCII码是美国国家信息交换标准字符码(American Standard Code for Information Interchange )的字头缩码。早期的ASCII码采用7位二进制代码对字符进行编码。它包括32个通用控制字符,10个阿拉伯数字,52个英文大,小字母,34个专用符号共128个。7位ASCII代码在最高位添加一个“0”组成8位代码,正好占一个字节,在存储和传输信息中,最高位常作为奇偶校验位使用。扩展ASCII码,即第八位不再视为校验位而是当作编码位使用。扩展 ASCII码有256个。

3

数0-9 ASCII码的编码值为30H-39H,大写英文字母A-Z的编码值为41H-5AH,小写英文字母a-z的编码值为61H-7AH。

四、DOS常用的几个系统功能调用

1. 调用方法:

DOS功能调用的子程序已按顺序编号,功能号(00H~68H),其调用方法是: (1) 功能号→AH

(2) 入口参数、出口参数→指定寄存器 (3) INT 21H

(4) INT 20H 此为结束语句

2、常用的系统功能调用

1) 1号调用——从键盘输入单个字符

人口参数:ah=01 ; 出口参数:al=输入字符的ascii码 功能: 等待从键盘输入一个字符并送入al。

4

2) 2号调用——在显示器上显示输出单个字符

人口参数:ah=02 ; 出口参数:dl=待显示字符的ascii码 功能:将dl中的字符送显示器显示。 3) 9号调用——在显示器上显示输出字符串

入口参数:ah=09h; ds:dx=字符串的起始地址;

功能:将当前数据区中DS:DX所指向的字符串送显示器显示,注意字符串必须以 '$' 结尾。

4) 0AH号调用——从键盘输入字符串

入口参数:ah=0ah; ds:dx=输入缓冲区的起始地址;

第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0。 第2个字节保留,以存放实际输入的字符个数。 第3个字节开始存放从键盘输入的字符串。

功能: 从键盘接收字符串送入内存的缓冲区,同时送显示显示。

五、命名文件过程

1.N 文件名.COM ;命名文件, 文件必须以.com结尾 2.输入 RBX ;查看 BX 寄存器,存放文件长度值高八位

3.输入 RCX ;以CX存放文件长度值的低八位 4.输入 W ;用W命令将该程序写入磁盘中,即存盘

六、DEBUG实验程序

1. 显示一个字符 word.com

MOV DL,41 MOV AH,2 INT 21 INT 20

5

2. 显示所有ASCII码的程序 asci.com

MOV CX,0100 MOV DL,00

MOV AH,02 ;0105 INT 21

INC DL LOOP 0105 INT 20

3. 由键盘输入任意字符串,然后显示出来 key.com

MOV DX,0116 ;0116:字符个数,0117:实际输入数(包含$),0118:实际数 MOV AH,0A INT 21 MOV DL,0A MOV AH,02 INT 21 MOV DX,0118 MOV AH,09 INT 21

INT 20 ;0114 DB 20 ;0116

0116 06

4. 显示一字符串 stri.com

MOV DX,109 MOV AH,09 INT 21 INT 20

DB 'May I help you? $' ;0109 

5. 将1~16放入以2000H开始的单元中; asm-2000.com

MOV BX,2000 MOV CX,0010 MOV AL,01

MOV [BX],AL ;0108 INC AL INC BX LOOP 0108 INT 20

6

6. 将1000H开始的4个单元中的大数找出来; dashu.com

MOV BX,1000

MOV AL,[BX] MOV CX,0003

INC BX ;0108 CMP AL,[BX] JNB 010F MOV AL,[BX]

DEC CX ;010F JNZ 0108 MOV DL,AL INT 20

7. 比较连续两个单元中数的大小,相等=88,不相等=FFH; comp50-2.COM

MOV SI,1000 MOV DI,2000 MOV CX,0002

MOV AL,[SI] ;0109 CMP AL,[DI] JZ 0113 MOV AL,FF JMP 0119

INC SI ;0113 INC DI LOOP 0109 MOV AL,88

INT 20 ;0119

8. 在1000h开始的100个单元中,搜索“$”字符,将字符的地址放入BX中,搜索不到则BX=FFFFH scas.com

MOV DI,1000 MOV AL,24 MOV CX,0064 CLD REPNZ SCASB

JZ 0112 MOV BX,FFFF JMP 0115

DEC DI ;0112

7

MOV BX,DI INT 20

9. 将5000为首的4个数,测试该数的最高位,为1送2000单元,为0送1000号单元; stor-lod.com

MOV SI,5000 MOV DI,1000 MOV BX,2000 MOV CX,0004 CLD LODSB

TEST AL,80 JNZ 0115 STOSB

JMP 011A

XCHG BX,DI ;0115 STOSB

XCHG BX,DI DEC CX JNZ 010D

INT 20 ;010D

10. 比较SI和DI的内容,相等则AL=00,不等则AL=FFH;COMPS.COM

MOV SI,1000 MOV DI,2000 CLD

MOV CX,0002 REPZ CMPSB

JZ 0112 MOV AL,FF JMP 0114

MOV AL,00 ;0112 INT 20 ;0114

11. 人机对话程序

:0100 DB “What’s your name? $” :0113 DB “Please input your code? $” :012c DB “OK! $”

:0131 MOV DX,0100 ;显示What’s your name?

8

MOV AH,09 INT 21 MOV DL,0A MOV AH,02 INT 21 MOV DL,0D INT 21

MOV DX,0200 ;从键盘输入名字 MOV AH,0A INT 21 MOV DL,0A MOV AH,02 INT 21 MOV DL,0D INT 21

MOV DX,0202 MOV AH,09 INT 21 MOV DL,0A MOV AH,02 INT 21 MOV DL,0D INT 21

MOV DX,0112 MOV AH,09 INT 21 MOV DL,0A MOV AH,02 INT 21 MOV DL,0D INT 21

MOV DX,0210 MOV AH,0A INT 21 MOV DL,0A MOV AH,02 INT 21 MOV DL,0D INT 21

MOV DX,012A MOV AH,09 INT 21 INT 20

;把名字显示出来 ;显示Please input your code? ;从键盘输入密码 ;显示OK! 9

:0200 DB 06 :0210 DB 08

七、汇编语言上机过程

1.上机前的软件准备:MASM510,Uedit32 2. 在MS-DOS操作系统下操作

1. 文本编辑器 (如:EDIT.COM ,Uedit32等) ○

2. 汇编程序 (如:MASM.EXE ,TASM.EXE 等) ○

3. 连接程序 (如:LINK.EXE 等) ○

4. 调试程序 (如:DEBUG.EXE 等) ○

八、汇编源程序

1.在屏幕上显示一个字符的源程序程序:

program segment ;定义段,段名“program”可任意取

assume cs:program ;把上面段的段基址放入 CS,即程序所在段的位置 mov dl,41h ;将显示字符的ascii码装入DL

mov ah,2 ;21功能的2号子功能调用,向屏幕输出一个字符 int 21h ;21号DOS功能调用 mov ah,4ch ;汇编结束,DOS返回 int 21h

program ends ;段终止 end ;汇编终止 2.显示所有ASCII的源程序:

program segment ;定义段;段名“program”可任意取 assume cs:program ;把上面定义段的段基址放入 CS mov cx,100h ;装入循环次数

mov dl,0 ;装入第一个ASCII码,随后每次循环装入新码 next: mov ah,2 int 21h

10

inc dl ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1

loop next ;循环指令,执行一次CX减1,直至CX为0,循环终止

mov ah,4ch ;汇编结束,DOS返回 int 21h

program ends ;段终止 end ;汇编终止 3.在屏幕上显示一个指定字符串的源程序:

data segment

string db 'May I help you?''$' data ends

code segment ;定义段,段名为code

assume cs:code,ds:data ;程序所在段的位置,代码段放在CS

寄存器中;数据段放在DS寄存器中

start: mov ax,data ;字符串数据段的开始地址 mov ds,ax ;ds←输出字符串数据段段地址 lea dx,string ;dx←输出字符串偏移地址

mov ah,09 ;9号子功能(显示字符串)调用 int 21h ;21号DOS功能调用

mov ah,4ch ;完成输出显示,DOS返回 int 21h

code ends ;代码段结束 end start ;整个汇编结束

4.显示所有26个大小写英文字符 alla-z.asm abc segment assume cs:abc mov cx,1ah mov dl,41h next: mov ah,02h int 21h inc dl loop next

mov cx,1ah mov dl,61h next2: mov ah,02h int 21h inc dl loop next2 mov ah,4ch

11

int 21h abc ends end

5. 对话程序 dialog2.asm

DATA SEGMENT BUF DB 09H ;允许个数 DB ? ;实际个数 DB 10 DUP (?) ;真实输入 HIT DB \NAM DB 0AH,0DH,\AGE DB 0AH,0DH,\WAN DB 0AH,0DH,\DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX DISP0: MOV DX,OFFSET HIT MOV AH,09H INT 21H MOV AH,01H INT 21H CMP AL,'Q' JZ QUIT

DISP1: MOV DX,OFFSET NAM MOV AH,09H INT 21H KELBD1:MOV DX,OFFSET BUF MOV AH,0AH INT 21H DISP2:MOV DX,OFFSET AGE MOV AH,09H INT 21H KELBD2:MOV DX,OFFSET BUF MOV AH,0AH INT 21H DISP3: MOV DX,OFFSET WAN MOV AH,09H INT 21H

12

QUIT: MOV AH,4CH INT 21H

CODE ENDS END START

6. 一位数的减法, 6-2=4 ab.asm

data segment buf db 06h,02h data ends code segment

assume cs:code,ds:data start: mov ax,data mov ds,ax mov al,buf sub al,buf+1 mov dl,al or dl,30h mov ah,02h int 21h mov ah,4ch int 21h code ends end start

7. 显示2位数结果disp10,16-3 ①

DATA SEGMENT

LIST DB 16,48,? DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX CALL ADSUB CALL OUTPR QUIT: MOV AH,4CH INT 21H ADSUB PROC

MOV AL,LIST ADD AL,LIST+1

13

DAA

MOV LIST+2,AL RET ADSUB ENDP

DISPL PROC OR DL,30H MOV AH,02H INT 21H RET DISPL ENDP

OUTPR PROC MOV AL,LIST+2 MOV AH,0 MOV BL,10 DIV BL MOV DL,AL MOV BH,AH CALL DISPL MOV DL,BH CALL DISPL RET OUTPR ENDP

CODE ENDS

END START

DATA SEGMENT

LIST DB 16,3 ,? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX CALL ADSUB CALL OUTPR QUIT: MOV AH,4CH INT 21H ADSUB PROC

MOV AL,LIST

14

SUB AL,LIST+1 MOV LIST+2,AL RET ADSUB ENDP

DISPL PROC OR DL,30H MOV AH,02H INT 21H RET DISPL ENDP

OUTPR PROC MOV AL,LIST+2 MOV AH,0 MOV BL,10 DIV BL MOV DL,AL MOV BH,AH CALL DISPL MOV DL,BH CALL DISPL RET OUTPR ENDP

CODE ENDS END START

8. 比较A、B两单元中的数,将较大的数送A单元。data segment

a db 39h b db 94h c db ? data ends code segment

assume cs:code,ds:data start:mov ax,data mov ds,ax mov al,a cmp al,b jnc next xchg al,b next: mov c,al

15

CPU: Central Processing Unit ,“中央处理器”的缩写, 又称微处理器。 RAM: Random-access memory.随机存储器, 随机存取内存, ROM: Read-only memory.只读存储器

KB:Kilo Byte,KB表示千字节。K=Kilo,构词成分,表示 千;千米;公斤; Million 百万

MB:Mega Byte,MB表示兆字节。M=Mega,构词成分,表示“兆;百万”。 GB:Giga Byte, GB表示千兆字节。G=Giga,构词成分,表示“千兆;十亿”。 DDR∶ Dual Data Rate SDRAM,双倍速率SDRAM。184线内存。 API∶ 应用程序接口。

Direct X∶ 微软专为PC多媒体硬件开发的接口。

Active X:是一种共享程序数据和功能的接口,如复制、粘贴等。 DLL∶动态连接库。动态调用的子功能程序。 IC卡:Intelligent Card,智能卡。 IC 芯片: Save 保存 exit 退出

Binary 二进制 Octal 八进制 Decimal 十进制 Hex Decimal 十六进制 assembly language 汇编语言 Accumulate 累加器 Addition 加 Subtraction 减 Multiplication 乘 Division 除 Debug 调试 Destination 目的 Direction 方向 Directory 目录

Index 索引 编入索引 变址

21

Source 来源 水源 源 Stack 堆叠 堆栈 堆 Interface 分界面 接口 Execution 执行 Code Segment 代码段 Extra segment 附加段

22

本文来源:https://www.bwwdw.com/article/grf3.html

Top