当前位置:文档之家› 8086指令系统汇编实训实例

8086指令系统汇编实训实例

8086指令系统汇编实训实例
8086指令系统汇编实训实例

8086指令系统实训实例

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

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

标志寄存器对照表

标志名称 设置 未设置 标志名称 设置 未设置 溢出 OV(溢出) NV(未溢出) 零位 ZR (为0) NZ(不等于零) 方向 UP(增加) DN (减少) 辅助进位 AC (有进位)NA(无进位) 中断 EI(许可) DI(禁止) 奇偶标志 PE(偶) PO(奇) 符号 NG(负) PL(正) 进位 CY (有进位) NC(清除进位)

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

堆栈段寄存器 数据寄存器

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

数据段寄存器

二、用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软件基本指令用法一览表

实例:查看主板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个。

数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。

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. 显示一个字符 https://www.doczj.com/doc/d913860166.html,

MOV DL,41

MOV AH,2

INT 21

INT 20

2. 显示所有ASCII码的程序 https://www.doczj.com/doc/d913860166.html,

MOV CX,0100

MOV DL,00

MOV AH,02 ;0105

INT 21

INC DL

LOOP 0105

INT 20

3. 由键盘输入任意字符串,然后显示出来 https://www.doczj.com/doc/d913860166.html,

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. 显示一字符串 https://www.doczj.com/doc/d913860166.html,

MOV DX,109

MOV AH,09

INT 21

INT 20

DB 'May I help you? $' ;0109

5. 将1~16放入以2000H开始的单元中; https://www.doczj.com/doc/d913860166.html,

MOV BX,2000

MOV CX,0010

MOV AL,01

MOV [BX],AL ;0108

INC AL

INC BX

LOOP 0108

INT 20

6. 将1000H开始的4个单元中的大数找出来; https://www.doczj.com/doc/d913860166.html,

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; https://www.doczj.com/doc/d913860166.html,

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 https://www.doczj.com/doc/d913860166.html,

MOV DI,1000

MOV AL,24

MOV CX,0064

CLD

REPNZ

SCASB

JZ 0112

MOV BX,FFFF

JMP 0115

DEC DI ;0112

MOV BX,DI

INT 20

9. 将5000为首的4个数,测试该数的最高位,为1送2000单元,为0送1000号单元; https://www.doczj.com/doc/d913860166.html,

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;https://www.doczj.com/doc/d913860166.html,

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?

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 ;显示Please input your code? 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 ;显示OK!

MOV AH,09

INT 21

INT 20

:0200 DB 06

:0210 DB 08

七、汇编语言上机过程

1.上机前的软件准备:MASM510,Uedit32

2. 在MS-DOS操作系统下操作

○1. 文本编辑器(如:https://www.doczj.com/doc/d913860166.html, ,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

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

int 21h

abc ends

end

5. 对话程序 dialog2.asm

DATA SEGMENT

BUF DB 09H ;允许个数

DB ? ;实际个数

DB 10 DUP (?) ;真实输入

HIT DB "INPUT Q TO QUIT OR ENY KEY CONTINUE. $" NAM DB 0AH,0DH,"WHAT'S YOUR NAME? $ "

AGE DB 0AH,0DH,"PLEASE INPUT YOUR AGE: $ "

WAN DB 0AH,0DH,"OK! $"

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

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

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

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 d

b 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

mov ah,4ch

int 21h

code ends

end start

9. 显示比较两个数的大小 Comp-ab.asm

data segment

a d

b 20h

b db 92h

data ends

code segment

assume cs:code,ds:data

start: mov ax,data

mov ds,ax

mov al,a

cmp b,al

ja bga

mov dl,'a'

mov bl,'b'

jmp disp

bga: mov dl,'b'

mov bl,'a'

disp: mov ah,2

int 21h

mov dl,'>'

int 21h

mov dl,bl

int 21h

mov ah,4ch

int 21h

code ends

end start

10. 统计负数的个数 ; nega.asm

data segment

buf db 2,-1,-56,-23,15,29,-5,28,3,4

db -22,-33,-44,-55,66,77,88,99,-11,9

count equ 20

nega db ?

data ends

code segment

assume cs:code,ds:data

start: mov ax,data

mov si,offset buf

mov dl,0

mov cx,count

lp: mov al,[si]

and al,al

jns next

inc dl

next: inc si

loop lp

mov nega,dl

or dl,30h

mov ah,02h

int 21h

mov ah,4ch

int 21h

code ends

end start

11. 计算字符串的长度; str-len.asm

在STR开始的缓冲区中存放有一个字符串,结束标志为$,计算该字符的长度并显示出来。

DATA SEGMENT

STR DB 'ABCDEFGHH$'

LEN DB 0

DATA ENDS

STACK SEGMENT PARA STACK 'STACK'

STT DB 100 DUP(?)

STACK ENDS

CODE SEGMENT

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

START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV SP,SIZE STT

LEA DI,STR

MOV AL,'$'

LP: CMP AL,[DI]

JZ STOP

INC LEN

INC DI

JMP LP

STOP: MOV DL,'='

INT 21H

MOV DL,LEN

OR DL,30H

INT 21H

MOV AH,4CH

INT 21H

CODE ENDS

END START

12. 字符比较,相同显示YES;不同显示NO。 p5-3.asm

data segment

d1 db 'a'

d2 db 'b'

res1 db 'yes','$'

res2 db 'no','$'

data ends

code segment

assume cs:code,ds:data

start: mov ax,data

mov ds,ax

mov al,d1

mov bl,bl

cmp al,bl

jne next1

lea dx,res1

jmp next2

next1: lea dx,res2

next2: mov ah,09h

int 21h

mov ah,4ch

int 21h

code ends

end start

13. 在以BUF为首地址的字节单元中存放了CNT个无符号数,找出其中最大的送入MAX字节单元。 https://www.doczj.com/doc/d913860166.html,

DATA SEGMENT

BUF DB 1,2,3,100,23,78,90,134

CNT EQU $-BUF

MAX DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV CX,CNT-1

MOV BX,OFFSET BUF

MOV AL,[BX]

LOOP1:INC BX

CMP AL,[BX]

JAE NEXT

MOV AL,[BX]

NEXT: DEC CX

JNZ LOOP1

MOV MAX,AL

MOV AH,4CH

INT 21H

CODE ENDS

END START

九、几个重要概念

1、什么是BIOS

BIOS是微机的基本输入输出系统(Basic Input-Output System),其内容集成在微机主板上的一个ROM芯片上,主要保存着有关微机系统最重要的基本输入输出程序,系统信息设置、开机上电自检程序和系统启动自举程序等。系统在完成 POST自检后, ROM BIOS 就首先按照系统 CMOS设置中保存的启动顺序搜寻软硬盘驱动器及CD-ROM、网络服务器等有效地启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的启动。主要功能:

(1)记录驱动系统中所配置的常用外设的驱动程序,如显示器、键盘、打印机、磁盘驱动器、通信接口等。

(2)开机自检,引导装入。

2、什么是CMOS

CMOS(互补金属氧化物半导体存储器),是微机主板上的一块可读写的RAM 芯片,用来保存当前系统的硬件配置和用户对某些参数的设定,如提供时间、内

存容量及设备配置情况等参数。CMOS由主板的电池供电,即使系统掉电,信息也不会丢失。

现在多数厂家将CMOS设置程序做到了 BIOS芯片中,在开机时通过按下某个特定键就可进入CMOS设置程序而非常方便地对系统进行设置,因此这种CMOS 设置又通常被叫做BIOS设置。

十、汇编语言常用专业英语词汇

Bus n. 总线、公共汽车

Carry n. 进位, 射程, 运载\vt.携带, 运送, 传送

Control n.控制, 支配, 管理, 调节, 抑制, 控制器, 调节装置

Code n. 代码, 代号, 密码, 编码

Command n. 命令

Destination n.目的地, [计] 目的, 目标

Direction n.方向, 指导,用法,说明

Directory n. 目录

Division n. 分开,除法

Extra a. 额外的,附加的

Flag n.旗, 标记

Bit n. 位

Byte n. 字节

Index n.索引, 〔计〕变址,[数学]指数

Instruction n. 指令、指示, 指导, 用法说明(书)

Interrupt vt. 中断, 插嘴

Pointer n.指示器、指针

Register n. 寄存器、记录, 登记簿, 注册表, vt.记录, 登记, 注册、挂号Segment n.段, 节, 片断\v.分割

Source n.来源, 水源, 原始资料

Stack n.堆, 一堆, 堆栈\v.堆叠

Memory n. 记忆, 回忆, 存储器, 内存

DOS: d(isk) o(perating) s(ystem)

PC:Personal Computer,个人计算机、个人电脑,又称微型计算机或微机。

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

x86汇编指令集

x86汇编指令集 数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX reg32,r/m8 ; o32 0F BE /r [386] MOVSX reg32,r/m16 ; o32 0F BF /r [386] MOVZX reg16,r/m8 ; o16 0F B6 /r [386] MOVZX reg32,r/m8 ; o32 0F B6 /r [386] MOVZX reg32,r/m16 ; o32 0F B7 /r [386] 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.

汇编经典小程序(精编文档).doc

【最新整理,下载后即可编辑】 实验一:判断一个数X的正,负数,还是零。(假设是正数,输出+,是负数,输出-,是零,输出This is a zore !) DATA SEGMENT X DB 10 CR EQU 0DH LF EQU 0AH W DB 'This is a zore!',CR,LF,'$' ZHENG DB '+',CR,LF,'$' FU DB '-',CR,LF,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X AND AL,AL JZ L1 SHL AL,1 JC L3 JMP L2 L1: MOV DX,OFFSET W MOV AH,9 INT 21H JMP L4 L2: MOV DX,OFFSET ZHENG MOV AH,9 INT 21H JMP L4 L3: MOV DX,OFFSET FU MOV AH,9 INT 21H

L4: MOV AH,4CH INT 21H CODE ENDS END START 实验二:求十个数中的最小数,并以十进制输出。(若要求最大的,只要把JC 改为JNC 即可)(仅局限于0---16间的数比较,因为ADD AL,30H只是针对一位的十六进制转换十进制的算法)DATA SEGMENT XDAT DB 0AH,1FH,02H,03H,04H,05H,06H,07H,08H,09H MIN DB ? CR EQU 0DH LF EQU 0AH W DB ' is min',CR,LF,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,9 MOV SI,OFFSET XDAT MOV AL,[SI] L2: CMP AL,[SI+1] JC L1 MOV AL,[SI+1] L1: INC SI LOOP L2 ADD AL,30H MOV DL,AL MOV AH,2

8086汇编指令手册

8086汇编指令手册 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 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内容装入标志寄存器.

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

24个汇编实例小程序

24个汇编小程序 题目列表: 逆序输出字符串“BASED ADDRESSING” 从键盘上输入两个数,分别放到x,y单元,求出它们的和 试编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域 键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出 从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符 把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来 求出首地址为data的100个字数组中的最小偶数,并把它放在ax中 输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match” 从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数 从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果 有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零 从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。如有,则把cl的第五位置1,否则将该位置置0 在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f分别考虑有符号数、无符号数情况) 一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C中 设在A、B和D单元中分别存放着三个数。若三个数都不是0,则求出三个数的和并存放在S单元,若其中有一个数为0,则把其它两个单元也清零。请编写此程序

8086汇编指令大全.

标志寄存器:9个有效位,分 6个状态寄存器和 3个控制寄存器 CF 当执行一个加法(减法使最高位产生进位(借位时 CF=1 否则 CF=0 PF 指令执行的结果低 8位有偶数个一时, CF=1 否则 CF=0 AF 当执行一个加法(减法使运算结果低 4位向高 4位有进位(借位时 AF=1 否则 AF+0 ZF 当前运算结果为零, ZF=1 否则 ZF=0 SF 符号标志位 OF 溢出标志位 DF 方向标志位 IF 中断允许位 IF=1时响应外部中断

TF 跟踪标志位 操作数:[目的操作数(OPD ,源操作数(OPS ] ;立即操作数,寄存器操作数,存储器操作数。寻址方式: 1 寄存器寻址例:INC AX ; MOV AX , BX 2 寄存器间接寻址 (寄存器只能是 BX , DI , SI , BP ; [PA=(BX 、 DI 、 SI +DS》 4 或 BP+SS》4] 3 寄存器相对寻址 4 基址变址寻址 5 相对基址变址寻址 6 直接寻址 7 立即数寻址 i. 立即数寻址立即数寻址不能用在单操作数指令中 ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段 指令系统: 1 数据传送指令 mov 注意: 不允许在两个存储单元之间直接传送数据

不允许在两个段寄存器之间传送数据 不允许用立即数直接为段寄存器赋值 不影响标志位 不允许寄存器或存储单元到除 CS 外的段寄存器 2 入栈(出栈指令 PUSH (POP 注意: PUSH 操作数不能是“立即数” POP 操作数不能是段寄存器 CS 不影响标志位 先进后出 单操作符 3 交换指令 XCHG 注意:

常用8086汇编指令(彩色版)

8086/8088指令系统 一、数据传送指令 1.通用数据传送指令 MOV(Move)传送 PUSH(Push onto the stack)进栈 POP(Pop from the stack)出栈 XCHG(Exchange)交换 .MOV指令 格式为:MOV DST,SRC 执行的操作:(DST)<-(SRC) .PUSH进栈指令 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出栈指令 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG交换指令 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) 2.累加器专用传送指令 IN(Input)输入 OUT(Output)输出 XLAT(Translate)换码 这组指令只限于使用累加器AX或AL传送信息. .IN输入指令 长格式为: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输出指令 长格式为:OUT PORT,AL(字节) OUT PORT,AX(字)

执行的操作:(PORT)<-(AL)(字节) (PORT+1,PORT)<-(AX)(字) 短格式为:OUT DX,AL(字节) OUT DX,AX(字) 执行的操作:((DX))<-(AL)(字节) ((DX)+1,(DX))<-AX(字) 在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息. .XLAT换码指令 格式为:XLAT OPR 或:XLAT 执行的操作:(AL)<-((BX)+(AL)) 3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指针送寄存器和DS LES(Load ES with Pointer)指针送寄存器和ES .LEA有效地址送寄存器 格式为:LEA REG,SRC 执行的操作:(REG)<-SRC 指令把源操作数的有效地址送到指定的寄存器中. .LDS指针送寄存器和DS指令 格式为:LDS REG,SRC 执行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器. .LES指针送寄存器和ES指令 格式为:LES REG,SRC 执行的操作:(REG)<-(SRC) (ES)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器. 4.标志寄存器传送指令 LAHF(Load AH with flags)标志送AH SAHF(store AH into flags)AH送标志寄存器 PUSHF(push the flags)标志进栈 POPF(pop the flags)标志出栈 .LAHF标志送AH

8086汇编语言指令的寻址方式有哪几类

1. 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 寄存器寻址最快 7. 下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。 XCHG CS , AX ;不能修改CS MOV [BX] , [1000] ;不能在两个内存单元之间直接进行数据传送 XCHG BX , IP ;不能用名字直接访问IP PUSH CS POP CS ;不允许直接修改CS值 IN BX , DX ;输入数据必须使用累加器AL或AX MOV BYTE [BX] , 1000 ;格式错误,且超范围,应为MOV word PTR [BX],1000 MOV CS , [1000];不允许直接修改CS值 20.带参数的返回指令用在什么场合?设栈顶地址为3000H,当执行RET 0006后,SP的值为多少? 利用堆栈传递参数时使用;对于近调用SP=3008H,对于远调用SP=300AH 27.设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶地址为多少?当执行 PUSH BX指令后,栈顶地址和栈顶2个字节的内容分别是什么? 栈顶地址:SS:SP,物理地址为:2FF00H;PUSH 完以后栈顶地址为:SS:SP=2010:FDFEH,即物理地址为:2FEFEH,内容为:57H 34H(由低地址到高地址) B P7 5. 设(DS)=3000H,(BX)=1100H,(CS)=0062H,(S1)=0002H,(31100H)=52H, (31101H)=8FH,(31162H)=6BH,(31163H)=99H,(31103H)=F6H, (32200H)=AAH,(32201H)=B6H,(32800H)=55H,(32801H)=77H,给出下列各指令执行后AX寄存器的内容: (1) MOV AX,BX (2) MOV AX,[BX] (3) MOV AX,4200H (4) MOV AX,[2800H] (5) MOV AX,1100H[BX] (6) MOV AX,[1160H+SI] 9. 分别执行下列各指令组,写出AX的内容: (1) MOV AX,93A4H NEG AX 73A4-8c5c,e689-1977 (AX)=6C5CH (2) XY DW "AB" MOV AX,XY (AX)=4142H (3) MOV AX,2B7EH MOV CX,4DB5H ADD AX,CX (AX)=7933H (4) XA DW 0BD57H MOV AX,0FBCDH AND AX,XA (AX)=B945H (5) STC MOV BX, 0B69FH MOV AX, 43A2H SBB AX, BX

8086汇编经典例程

========================================== 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

8086 汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

LEA DX,FNAME MOV CX,0 ;语句1 INT 21H JC EXIT MOV FNUM,AX MOV BX,AX ;语句2 MOV CX,100 MOV AH,40H LEA DX ,BUF INT 21H MOV BX,FNUM MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。 2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么? 1>汇编: C:\masm> masm lab7; 2>连接: C:\masm> link lab7; 3>运行: C:\masm> lab7 3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别? 4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用. 5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用. 实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。源程序下: assume cs:code code segment start: mov ax,cs mov ds,ax

mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例程cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21h do:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*12+60 mov cx,13 s: mov al,ds:[si] mov ah,15 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

汇编语言小程序

16进制转化为10进制STACK SEGMENT STACK'STACK' DW100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT KEYBUFFER DB100 ;DB ? ;DB 100 DUP(?) DECIMAL DB 5 DUP(?) STRING1 DB'PLEASE INPUT DECIMAL DATA:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,CS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SS,AX LEA SP,TOP LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER ;MOV AX,23456 INT 21H ;LEA SI,KEYBUFFER MOV AX,DX LEA DI,DECIMAL CALL DISPAX MOV AH,4CH MOV AL,0 INT 21H DISPAX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI LEA DI,DECIMAL

CALL TRANS16TO10 MOV CX,5 LEA DI,DECIMAL+4 MOV AH,2 DISPAXD: MOV DL,[DI] ADD DL,30H DEC DI INT 21H LOOP DISPAXD POP DI POP DX POP CX POP BX POP AX RET DISPAX ENDP TRANS16TO10 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV BX,10 MOV CX,5 LOOP1: XOR DX,DX DIV BX MOV[DI],DX INC DI LOOP LOOP1 LEA DX,DECIMAL MOV AH,09H INT 21H POP DI POP DX POP CX POP BX POP AX RET TRANS16TO10 ENDP

8086汇编指令表

8086汇编指令表

MOV MOV DST,SRC DST≠CS、IP和imm 不影响 标志位 MOV [9AF0H],AL MOVS MOVS mem, mem MOVSB/W 不影响 标志位 字符串传送ES:DI←(DS:SI) SI←(SI)(+/-)1 DI←(DI)(+/-)1 MOVS ES:BYTE PTR[DI], DS:[SI] MUL MUL r/m8 设置CF OF S Z A P无法预 测 无符号乘法:AX←AL*r/m8 MUL CL MUL r/m16 无符号乘法:DX:AX←AX*r/m16 MUL CX NEG NEG reg/mem CF OF SF ZF AF PF 求补:取反加一 0-(DST) NEG CL NOP NOP 不影响空操作NOP NOT NOT reg/mem 不影响按位取反NOT CL OR 同AND PF SF ZF CF=OF=0 逻辑或 OR AL,0FH (不变\置1) OUT OUT imm8,AL/AX/EAX 不影响 标志位 将AL/AX/EAX输出到imm8指定端 口 OUT 0FFH,AL OUT DX,AL/AX/EAX 将AL/AX/EAX输出到DX指定的端口OUT DX,AL POP POP DST DST!=imm & CS 不影响 标志位 DST←((SP)+1,(SP)) SP←(SP)+2 POP WORD Ptr [87EAH] POPF POPF 设置所有标志位从堆栈中弹出16位标志寄存器POPF PUSH PUSH SRC 8086 SRC!=imm 不影响 标志位 SP<--(SP)-2 ((SP)+1,(SP))←(SRC) [SP循 环] PUSH WORD Ptr [87EAH] PUSHF PUSHF 不影响压栈16位标志寄存器PUSHF RCL 同SHL 同ROL 带进位循环左移 RCL AL,1 RCR 同SHL 同ROL 带进位循环右移 RCR AL,1 ROL 同SHL 移一位后符号位 改变则OF=1 循环左移: ROL AL,1 ROR 同SHL 同ROL 循环右移: ROR AL,1 REP REP String operation 不影响 标志位 CX=0则终止---CX←(CX)-1 ---串操作---SI/DI增量 REPZ REPE REPE String operation AF CF OF PF SF ZF CX=0||ZF=0则终止 ---CX←(CX)-1 ---串比较---SI/DI增量 REPNZ REPNE REPNE String operation AF CF OF PF SF ZF CX=0||ZF=1则终止--- CX←(CX)-1 ---串比较---SI/DI增量 RET RET 恢复压栈标志位 POP IP[CS] 子过程返回(Near)/(Far) RET RET imm16 子过程返回后SP←(SP)+imm16 RET 08

8086指令总结

8086指令系统总结 学习微处理器及其程序设计,必须掌握微处理器的指令系统。本章以8086 微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。要明确各种寻址方式的区别和特点,掌握有效地址和物理地址的计算方法,要正确使用指令,掌握各类指令的功能、对标志位的影响和使用上的一些特殊限制。能够编写小汇编程序,初步掌握汇编程序的编写和调试方法。 本章的重点难点内容是:8086 的指令格式及寻址方式,8086 的常用指令和8086 指令前缀的使用。 下面我们分别进行总结: 一.8086寻址方式 (1)操作数是数字,指令中立即写出数字------------立即数寻址 MOV AX,1234H 解释此句意义 (2)操作数是寄存器内容,指令中写出寄存器的符号---------寄存器寻址 MOV AX,BX (3)操作数是存储单元内容,用括号括出存储单元有效地址-----直接寻址 MOV AX,[1234H] MOV AX,ES:[1234H] (4)操作数是存储单元内容,用括号括出寄存器或其表达式,寄存器或其表达式的值为存储单元有效地址-------------间接寻址MOV AH,[BX] MOV AX,ES:[SI] MOV AL,[BX+SI+5]===5[BX+SI]===5[BX][SI] 二.8086指令系统 1.数据传送指令 (一)通用传送指令 (1)MOV指令 指令格式:MOV 目,源 功能:将源操作数传送给目标操作数。 (2)堆栈操作指令 进栈指令:PUSH 格式:PUSH 源 功能:将源操作数压入堆栈。 例:用堆栈指令完成上例的功能。 MOV AX,3000H MOV DS,AX ;段寄存器填充 MOV SI,0100H ;基本指令执 MOV DI,2000H ;行前的初值 MOV CX,50 NT: PUSH [SI] ;程序从这 POP [DI] ;开始设计 INC SI INC SI INC DI INC DI LOOP NT MOV AH,4CH INT 21H

8086汇编语言上机调试步骤

8086汇编语言上机调试步骤 1、在网络课堂-微机原理与接口技术-实验指导-汇编工具下载,下载汇编工具并解压,文件夹名为“masm”。 2、用鼠标点击“masm”文件夹。进入该文件夹后将看到 MASM.EXE, LINK.EXE , DEBUG.EXE3个文件进行复制操作。 3、用鼠标点击“我的电脑”再点击D: 盘,并在 D: 盘上建立新的“ MASM”文件夹,最后将上面的3个文件全部复制到该文件夹中。(注意实验所有的文件都放在该文件夹内) 4、用文本编辑软件UltraEdit-32、WINDOWS 中的记事本或其它的文本编辑器输入汇编语言程序, 注意在最后一行的 END输入完后要按一次回车键,保存的源 文件的扩展各一定要是“.asm”如: example.asm 。(建议用记事本输入源程序,另存时,保持类型选择“所有文件”如图所示) 5、进入MS-DOS方式 ( 从开始>程序>附件>命令提示符) 或者(从程序 > 运行输入“cmd”回车,进入MS-DOS环境。

6、进入D:>MASM文件夹 7、显示MASM文件夹内所有文件“dir”命令 8、在 DOS 提示符下进行汇编、连接、动态调试等操作。 例如: 对源文件 example.asm 进行的操作

D:\MASM\MASM example.asm;汇编源程序操作 D:\MASM\LINK example.dbj;连接并生成扩展名为 .EXE 的可执行文件 D:\MASM\DEBUG example.exe;对可执行文件进行调试 9、要求掌握的调试命令(在 DEBUG 中使用的命令) a: U - 反汇编命令 用法: -U 代码段地址:起始偏移地址如:-U CS:100 b: D - 显示内存中的数据命令 用法: -D 数据段地址:存放数据的偏移地址如:-D DS:00 20 c: T - 单步执行程序命令 用法: -T 要执行的指令条数如:-T 3 d: G - 连续执行程序命令 用法: -G=代码段地址:指令的起始偏移地址指令的结束偏移地址如: -G=CS:100 106 注意: 结束地址一定要是操作码的所在地址 e: R - 查看和修改寄存器数据命令 用法: -R 回车如:-R AX f: F - 对内存单元填充数据命令 用法: -F 数据段地址:偏移首地址偏移未地址填入的数据 如: -F DS:100 120 ff g: Q - 退出”DEBUG“应用程序命令 10、应用例子 ;二进制到BCD转换(a.asm) ;将给定的一个二进制数,转换成二十进制(BCD)码 DATA SEGMENT RESULT DB 3 DUP(?) DATA ENDS CODE SEGMENT

8086汇编语言程序设计实验指导书.

汇编语言上机实验指导书 一、概述 上机实验总学时为16学时,其中综合性实验为2学时。实验共有6项暂定为8次,每次2学时。 1.实验辅导的主要内容 实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。开始的实验介绍较细,后面的实验简要介绍。 2.实验的软硬件要求 关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。 3.加强实践能力的培养 实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括: 实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等; 开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。 对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。 实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性) 1.实验目的: (1) 熟悉汇编语言运行环境和方法 (2)了解如何使用汇编语言编制程序 (3) 熟悉DEBUG有关命令的使用方法 (4) 利用DEBUG掌握有关指令的功能 (5) 利用DEBUG运行简单的程序段 2.实验内容 (1)学会输入、编辑汇编语言程序 (2)学会对汇编语言程序进行汇编、连接和运行 (3)进入和退出DEBUG程序 (4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。 3.实验准备 (1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。 (2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。 (3) 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG 命令的内容,对有关命令,都要事先准备好使用的例子。 4.实验步骤 (1)在DOS提示符下,进入MASM目录。 (2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。 ①调用edit输入、编辑源程序并保存在指定的目录中;例:edit abc.asm ②用汇编程序masm对源程序汇编产生目标文件obj。例:masm abc 不断修改错误,直至汇编通过为止。 ③用连接程序link产生执行文件exe.例:link abc ④执行程序 可直接从DOS执行程序,即在DOS环境中,输入文件名即可。 (3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。 5.实验报告要求 (1)源程序清单。 (2) 如何启动和退出EDIT程序。 (3) 如何对源程序进行汇编及编辑。

汇编小程序

---------程序sy3-1:实现从键盘输入一位数字,判断其奇偶性。并在屏幕上输出一个标志,若为奇数,则输出1;否则输出0。 ---------如果输入的不是数字,则显示字符串“ERROR”。 DATAS SEGMENT STRING DB "ERROR$" ;定义字符串 FLAG DB ? ;设置奇偶标志 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV FLAG,'1' ;给标志位FLAG赋初值 MOV AH,01H INT 21H ;接收键盘输入一位数 CMP AL,30H JB ERR CMP AL,39H JA ERR TEST AL,01H ;测试,根据最后一位判断奇偶性 JNZ OUTPUT ;不为0则为奇数 MOV FLAG,'0' OUTPUT: MOV DL,FLAG MOV AH,02H INT 21H ;输出标志位 JMP EXIT ERR: ;显示字符串 MOV DX,OFFSET STRING MOV AH,9 INT 21H EXIT: MOV AH,4CH INT 21H CODES ENDS END START

;---------程序sy3-2:根据用户输入的星期几数字代号(0代表星期天),在屏幕上显示相应的英文缩写名。 DATAS SEGMENT s0 db "Sun$" S1 DB "Mon$" S2 DB "Tue$" S3 DB "Wed$" S4 DB "Thu$" S5 DB "Fri$" S6 DB "Sat$" ADDR_TABLE DW S0,S1,S2,S3,S4,S5,S6 ;定义地址表 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AH,1 INT 21H ;接受键盘输入 CMP AL,30H JB EXIT CMP AL,36H ;不是数字0~6,则退出程序 JA EXIT SUB AL,30H ;转变为数字 MOV BL,2 MUL BL ;数字乘以2的结果是在地址表中的相应位置的偏移值MOV BX,AX ;将输入的数字转换为地址表中的偏移地址 MOV DX,ADDR_TABLE[BX] ;取地址表中的相应内容(即DX为字符串的偏移地址)MOV AH,9 INT 21H ;显示字符串 EXIT: MOV AH,4CH INT 21H CODES ENDS END START

相关主题
文本预览
相关文档 最新文档