8086指令系统汇编实训实例资料Word文档格式.docx
《8086指令系统汇编实训实例资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《8086指令系统汇编实训实例资料Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
2)段地址:
04ba:
100或4ba:
100
3)默认段寄存器不写,只写偏移量,如:
100;
4)确定地址范围可以有两种表示方式:
a)段地址:
起始地址的偏移量结束地址的偏移量,如:
100110;
b)段地址:
起始地址的偏移量L(长度),如:
100L10;
DEBUG软件基本指令用法一览表
指令
格式
功能
备注
A
A[首地址]
编译汇编语言指令
A100
C
C[区段1][区段长度][区段2]
将两块内存作比较
C100L20200
D
D[地址][长度]&
[地址范围]
显示内存的内容
D100L20
E
E[地址]空格键编辑下一个
编辑内存内容
E100
F
F[地址][长度][内容]
填充指定内存区块内容
F100L1090
G
G=[地址][断点1][断点2]
带有任选断点执行
G=100……
H
H[数1][数2]
十六进制数加减
H4433
I
I[端口地址]
读/显示输入字节
I70
L
L[地址]或[磁碟,磁轨,扇区]
装入文件或磁区
L100212
M
M[原地址][长度][目标地址]
传送内存区块
M100L10110
N
N[文件名]
定义文件名
N
O
O[端口位址]
输出字节到端口
O7019
Q
退出DEBUG界面
R
R[寄存器]
显示修改寄存器
RAX
S
S[地址][长度]‘参数’
对字符进行检索
S100L70'
j'
T
T[=地址]或[指令条数]
单步追踪
U
U[地址][指令长度]
反汇编
U100默认32字节
W
W[地址]或[指定BX、CX范围]
写入文件,默认写入
CS:
W200
实例:
查看主板BIOS信息:
①输入“DFE00:
0”,回车后看到的结果就是主板BIOS的厂商信息。
②接着再输入“DFFFF:
5L8”,回车后,主板的BIOS版本日期也出来了。
三、ASCII码与BCD编码
ASCII码是美国国家信息交换标准字符码(AmericanStandardCodeforInformationInterchange)的字头缩码。
早期的ASCII码采用7位二进制代码对字符进行编码。
它包括32个通用控制字符,10个阿拉伯数字,52个英文大,小字母,34个专用符号共128个。
7位ASCII代码在最高位添加一个“0”组成8位代码,正好占一个字节,在存储和传输信息中,最高位常作为奇偶校验位使用。
扩展ASCII码,即第八位不再视为校验位而是当作编码位使用。
扩展ASCII码有256个。
数0-9ASCII码的编码值为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;
dx=输入缓冲区的起始地址;
第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0。
第2个字节保留,以存放实际输入的字符个数。
第3个字节开始存放从键盘输入的字符串。
从键盘接收字符串送入内存的缓冲区,同时送显示显示。
五、命名文件过程
1.N文件名.COM;
命名文件,文件必须以.com结尾
2.输入RBX;
查看BX寄存器,存放文件长度值高八位
3.输入RCX ;
以CX存放文件长度值的低八位
4.输入W;
用W命令将该程序写入磁盘中,即存盘
六、DEBUG实验程序
1.显示一个字符
MOVDL,41
MOVAH,2
INT21
INT20
2.显示所有ASCII码的程序
MOVCX,0100
MOVDL,00
MOVAH,02;
0105
INT21
INCDL
LOOP0105
INT20
3.由键盘输入任意字符串,然后显示出来
MOVDX,0116;
0116:
字符个数,0117:
实际输入数(包含$),0118:
实际数
MOVAH,0A
MOVDL,0A
MOVAH,02
MOVDX,0118
MOVAH,09
INT20;
0114
DB20;
0116
011606
4.显示一字符串
MOVDX,109
MOVAH,09
INT21
INT20
DB'
MayIhelpyou?
$'
;
0109
5.将1~16放入以2000H开始的单元中;
asm-
MOVBX,2000
MOVCX,0010
MOVAL,01
MOV[BX],AL;
0108
INCAL
INCBX
LOOP0108
INT20
6.将1000H开始的4个单元中的大数找出来;
MOVBX,1000
MOVAL,[BX]
MOVCX,0003
INCBX;
CMPAL,[BX]
JNB010F
DECCX;
010F
JNZ0108
MOVDL,AL
7.比较连续两个单元中数的大小,相等=88,不相等=FFH;
comp50-2.COM
MOVSI,1000
MOVDI,2000
MOVCX,0002
MOVAL,[SI];
CMPAL,[DI]
JZ0113
MOVAL,FF
JMP0119
INCSI;
0113
INCDI
LOOP0109
MOVAL,88
INT20;
0119
8.在1000h开始的100个单元中,搜索“$”字符,将字符的地址放入BX中,搜索不到则BX=FFFFH
MOVDI,1000
MOVAL,24
MOVCX,0064
CLD
REPNZ
SCASB
JZ0112
MOVBX,FFFF
JMP0115
DECDI;
0112
MOVBX,DI
9.将5000为首的4个数,测试该数的最高位,为1送2000单元,为0送1000号单元;
stor-
MOVSI,5000
MOVDI,1000
MOVBX,2000
MOVCX,0004
LODSB
TESTAL,80
JNZ0115
STOSB
JMP011A
XCHGBX,DI;
0115
XCHGBX,DI
DECCX
JNZ010D
010D
10.比较SI和DI的内容,相等则AL=00,不等则AL=FFH;
COMPS.COM
REPZ
CMPSB
JMP0114
MOVAL,00;
11.人机对话程序
:
0100DB“What’syourname?
$”
0113DB“Pleaseinputyourcode?
012cDB“OK!
$”
:
0131MOVDX,0100;
显示What’syourname?
MOVAH,09
MOVDL,0A
MOVAH,02
MOVDL,0D
MOVDX,0200;
从键盘输入名字
MOVAH,0A
MOVDX,0202;
把名字显示出来
MOVDX,0112;
显示Pleaseinputyourcode?
MOVDX,0210;
从键盘输入密码
MOVDX,012A;
显示OK!
:
0200DB06
0210DB08
七、汇编语言上机过程
1.上机前的软件准备:
MASM510,Uedit32
2.在MS-DOS操作系统下操作
.文本编辑器(如:
EDIT.COM,Uedit32等)
.汇编程序 (如:
MASM.EXE,TASM.EXE等)
.连接程序 (如:
LINK.EXE等)
.调试程序 (如:
DEBUG.EXE等)
八、汇编源程序
1.在屏幕上显示一个字符的源程序程序:
programsegment ;
定义段,段名“program”可任意取
assumecs:
program ;
把上面段的段基址放入CS,即程序所在段的位置
movdl,41h ;
将显示字符的ascii码装入DL
movah,2 ;
21功能的2号子功能调用,向屏幕输出一个字符
int21h ;
21号DOS功能调用
movah,4ch;
汇编结束,DOS返回
int21h
programends;
段终止
end;
汇编终止
2.显示所有ASCII的源程序:
programsegment;
定义段;
段名“program”可任意取
assumecs:
program;
把上面定义段的段基址放入CS
movcx,100h;
装入循环次数
movdl,0;
装入第一个ASCII码,随后每次循环装入新码
next:
movah,2
int21h
incdl;
INC:
递增指令,每次将数据寄存器DL内的数值加1
loopnext;
循环指令,执行一次CX减1,直至CX为0,循环终止
movah,4ch;
programends;
end;
3.在屏幕上显示一个指定字符串的源程序:
datasegment
stringdb'
'
dataends
codesegment ;
定义段,段名为code
assumecs:
code,ds:
data ;
程序所在段的位置,代码段放在CS寄存器中;
数据段放在DS寄存器中
start:
movax,data ;
字符串数据段的开始地址
movds,ax ;
ds←输出字符串数据段段地址
leadx,string ;
dx←输出字符串偏移地址
movah,09 ;
9号子功能(显示字符串)调用
int21h;
movah,4ch;
完成输出显示,DOS返回
int21h
codeends;
代码段结束
endstart;
整个汇编结束
4.显示所有26个大小写英文字符alla-z.asm
abcsegment
abc
movcx,1ah
movdl,41h
movah,02h
int21h
incdl
loopnext
movdl,61h
next2:
loopnext2
movah,4ch
abcends
end
5.对话程序dialog2.asm
DATASEGMENT
BUFDB09H;
允许个数
DB?
实际个数
DB10DUP(?
);
真实输入
HITDB"
INPUTQTOQUITORENYKEYCONTINUE.$"
NAMDB0AH,0DH,"
WHAT'
SYOURNAME?
$"
AGEDB0AH,0DH,"
PLEASEINPUTYOURAGE:
WANDB0AH,0DH,"
OK!
$"
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
DISP0:
MOVDX,OFFSETHIT
MOVAH,09H
INT21H
MOVAH,01H
INT21H
CMPAL,'
Q'
JZQUIT
DISP1:
MOVDX,OFFSETNAM
KELBD1:
MOVDX,OFFSETBUF
MOVAH,0AH
DISP2:
MOVDX,OFFSETAGE
KELBD2:
DISP3:
MOVDX,OFFSETWAN
INT21H
QUIT:
MOVAH,4CH
CODEENDS
ENDSTART
6.一位数的减法,6-2=4ab.asm
bufdb06h,02h
codesegment
assumecs:
data
movax,data
movds,ax
moval,buf
subal,buf+1
movdl,al
ordl,30h
codeends
endstart
7.显示2位数结果disp10,16-3
①
LISTDB16,48,?
CALLADSUB
CALLOUTPR
INT21H
ADSUBPROC
MOVAL,LIST
ADDAL,LIST+1
DAA
MOVLIST+2,AL
RET
ADSUBENDP
DISPLPROC
ORDL,30H
MOVAH,02H
DISPLENDP
OUTPRPROC
MOVAL,LIST+2
MOVAH,0
MOVBL,10
DIVBL
MOVDL,AL
MOVBH,AH
CALLDISPL
MOVDL,BH
OUTPRENDP
CODEENDS
②
LISTDB16,3,?
CODESEGMENT
SUBAL,LIST+1
MOVAH,0
8.比较A、B两单元中的数,将较大的数送A单元。
adb39h
bdb94h
cdb?
assumecs:
movax,data
moval,a
cmpal,b
jncnext
xchgal,b
movc,al
movah,4ch
endstart
9.显示比较两个数的大小Comp-ab.asm
adb20h
bdb92h
movds,ax
moval,a
cmpb,al
jabga
movdl,'
a'
movbl,'
b'
jmpdisp
bga:
movdl,'
disp:
int21h
>
movdl,bl
movah,4ch
endstart
10.统计负数的个数;
nega.asm
bufdb2,-1,-56,-23,15,29,-5,28,3,4
db-22,-33,-44,-55,66,77,88,99,-11,9
countequ20
negadb?
movsi,offsetbuf
movdl,0
movcx,count
lp:
moval,[si]
andal,al
jnsnext
incdl
incsi
looplp
movnega,dl
endstart
11.计算字符串的长度;
str-len.asm
在STR开始的缓冲区中存放有一个字符串,结束标志为$,计算该字符的长度并显示出来。
DATASEGMENT
STRDB'
ABCDEFGHH$'
LENDB0
DATAENDS
STACKSEGMENTPARASTACK'
STACK'
STTDB100DUP(?
)
STACKENDS
ASSUMECS:
DATA,SS: