微机原理与接口技术编程指令分析较详细Word文件下载.docx
- 文档编号:19129572
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:19
- 大小:22.75KB
微机原理与接口技术编程指令分析较详细Word文件下载.docx
《微机原理与接口技术编程指令分析较详细Word文件下载.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术编程指令分析较详细Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
MOVDX,500H;
端口地址
INAL,DX;
从外部端口输入容到AL
CLC;
清零借位标志CF
CMPAL,70H;
AL-70H
JCLP1;
CF=1有借位,AL<
70H,转LP1
CMPAL,80H;
=70H,AL-80H
JCLP2;
70H<
AL<
80H,转LP2
MOVAL,0FFH;
=80H,AL=0FFH(第一个16进制数为字母的,前面加0,以区别程序中的变量)
LP3:
MOVDX,502H;
输出端口地址赋到DX中
OUTDX,AL;
将结果传送到外部端口
LP1:
MOVAL,00H
JMPLP3
LP2:
MOVAL,88H
6、设X、Y、Z是三个16位有符号数,存放在@DATA的数据段,寻找最大数,存到MAX单元
MOVAX,@DATA
MOVDS,AX;
DS段初始化
MOVAX,X
CMPAX,Y
JGEL1;
X>
=Y,转L1
MOVAX,Y;
X<
=Y,大数Y赋到AX中
L1:
CMPAX,Z;
AX-Z,
JGEL2;
AX>
=Z,转L2
MOVAX,Z;
AX<
Z,大数Z赋到AX中
L2:
MOVMAX,AX;
最大数赋到MAX存储单元
7、若在3000:
3000H和3000:
3001H单元有两个无符号数,编一个程序比较它们的大小,把大的数放在3000:
3002H单元
MOVAX,3000H
MOVAL,[3000H];
低地址单元容AL←(DS×
16+3000)
CMPAL,[3001H];
两容相比较
JAEL;
(aboveandequal)AL>
=高
XCHGAL,[3001H];
高的,交换
L:
MOV[3002H],AL
8、设X、Y、Z、W均为存放16位带符号数单元的地址。
编写程序段完成下列操作
Z←W+(Z-X)
MOVAX,Z
SUBAX,X;
AX←Z-X
MOVDX,W
ADDDX,AX;
DX←DX+AX
MOVZ,DXZ←DX
HLT
9、编写汇编简易程序段,若自BLOCK开始的存缓冲区中,有100个带符号的数(字为单位),希望找到其中最大的一个值,并将它放到MAX单元中。
MOVCX,99;
0-99个带字符的数
MOVBX,0;
起始偏移地址
MOVMAX,BLOCK[BX];
第一个数放入MAX中
LOOP1:
MOVAX,BLOCK[BX];
BLOCK[BX]放入到AX里
CMPAX,BLOCK[BX+2];
两个数进行比较
JGENEXT;
第一个数>
=第二个数,跳到NEXT
MOVMAX,BLOCK[BX+2];
第二个数大,就放到MAX里
NEXT:
ADDBX,2;
每次加2
LOOPLOOP1
★10、试用无条件传送方式分别从1000H、1002H端口读入2个字节后,屏蔽每个字节的低四位,然后将其分别送当前数据段2000H、2001H单元和端口3000H、3002H
MOVDX,1000H
INAL,DX
ANDAL,0F0H
MOV[2000H],AL
MOVDX,3000H
OUTDX,AL
MOVDX,1002H
MOV[2001H],AL
MOVDX,3002H
(若改为1000H~10FFH256
2000H~20FFH256
3000H~30FFH256
则MOVCX,100H;
总字节数
MOVBX,2000H;
目的地址(当前数据段)
MOVSI,1000H;
原数据地址(也在外部端口)
MOVDI,3000H;
目的地址(外部端口)
MOVDX,SI
从外部端口输入数据到AL
ANDAL,0F0H;
保留高四位,低四位清零
MOV[BX],AL;
处理后的数据送当前数据段地址
MOVDX,DI
处理后的数据传送到外部端口地址
INCBX
INCSI
INCDI
LOOPL
★11、试用无条件传送方式将存数据段中偏移地址为3500H~3502H单元的容依次送225H~227H端口
MOVAL,[3500H];
容的存地址,传送的是容
MOVDX,225H;
OUTDX,AL;
传送到外部端口
MOVAL,[3501H]
MOVDX,226H
MOVAL,[3502H]
MOVDX,227H
(若改为5000H~50FFH→200H~2FFH
则MOVSI,5000H;
原数据初始地址
MOVDX,200H;
目的端口地址
数据个数
MOVAL,[SI];
数据传输到外部端口
INCDX
LOOPL
★12、设AX寄存器中存放一个16位二进制数,试编写一个程序,统计AX中“1”的个数,统计结果送AX中
MOVCX,0;
计数器清零
LOOP:
SUBAX,0;
AL-0
JZSTP;
AL=0,跳转
SALAX,1;
算术左移一位(到CF里)
JNCNOD;
CF=0
INCCX;
CF=1,计数值加一
NOD:
JMPLOOP
STP:
13、设AX中有一个16位二进制数,试编写程序,统计AX中为“1”的位数,统计的结果送CX中,若为“1”的位数为偶数,则将数据55H写入AX
MOVCX,0;
计数值清零
AX-0
JZSTP;
AX=0,1的个数为0,是偶数,转STP
SALAX,1;
左移一位,最高位进CF
CF=0,最高位不是1,转NOD
最高位是1,计数值加1
JMPLOOP
RCRCX,1
JCSTOP
MOVAX,55H
STOP:
14、若在DAT开始的顺序50个单元中,存放着某班50个同学的数学课考试成绩。
试编写程序求该班这门课的平均成绩
MOVCX,50;
计数初始值
MOVSI,DAT;
初始地址
XORAX,AX;
累加器AX清零
ADDAL,[SI];
从第一个开始相加放入AL(8位)中,2为十进制
ADCAH,0;
取进位,放入AH中(进位值不会超过50(8位))
INCSI;
地址加一
MOVBL,50;
除数
DIVBL;
取平均
(若改为500个同学,则“50”→500;
“BL,50”→BX,500;
“BL”→BX;
“XORAX,AX”后添加MOVDX,0;
“ADCAH,0”后添加ADCDX,0)
MOVCX,500;
MOVDX,0
ADDAL,[SI];
ADCAH,0;
取进位,放入AH中(进位值会超过99)超过8位2进制
ADCDX,0;
再取进位(一位十进制)
MOVBX,500;
DIVBX;
15、大小写字母转换
已知在以BUF为首地地址的字节存储区中,存放着一个以‘$’作结束标志的字符串,编写程序,显示该字符串,并要求将小写字母以大写字母形式显示出来。
(小写a为61H,大写A为41H。
)
STUCKSEGMENT
DB200DUP(0)
STUCKENDS
DATASEGMENT
BUFDB'
addAX,BXsubCX,10MOVdx,1234hEND$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STUCK
BEGIN:
MOVAX,DATA
MOVDS,AX;
数据段地址装填(堆栈段地址由系统装填)
LEABX,BUF;
BUF(存储区域)首地址→BX
LOPA:
MOVDL,[BX];
直接寻址,容→DL
CMPDL,'
$'
;
确定没有到最后一个容
JEEXIT
CMPDL,'
a'
容与‘a’比较
JBN;
DL<
’a’
z'
容与’z’比较
JAN;
DL>
’z’
SUBDL,20H;
’a’<
’z’,为小写字母,DL-20H,变为大写
N:
MOVAH,2;
显示字符用DOS的2号功能调用
INT21H;
修改后的容输出到显示器
INCBX;
地址值加1
JMPLOPA
EXIT:
MOVAH,4CH;
返回DOS
INT21H
CODEENDS
ENDBEGIN
28.编写一个程序,求W=(X2-Y2)/Z,设X、Y、均为一个8位无符号数,运算不考虑溢出。
分析:
表达式改写为W=(X+Y)(X-Y)/Z,因为表达式简单,根据表达式运算次序来编写程序,由于运算不考虑溢出,所以不考虑(X+Y)>256情况。
解:
程序清单如下:
STUCKSEGMENTPARASTACK
DW20HDUP(0)
DATASEGMENT
DATXDB80;
假定X为80
DATYDB50;
定义Y的值
DATZDB5;
定义Z的值
DATWDB?
;
定义保存计算结果的存储单元
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
BEGIN:
MOVAX,DATA
MOVDS,AX;
MOVAL,DATX;
取X
ADDAL,DATY;
计算(X+Y)→(AL)
MOVBL,DATX;
SUBBL,DATY;
计算(X-Y)→(BL)
MULBL;
计算AL×
BL→(AX)即(X+Y)×
(X-Y)→(AX)
MOVCL,DATZ;
取Z
DIVCL;
计算AX/Z→AL即(X+Y)×
(X-Y)/Z→AL
MOVDATW,AL;
保存结果
MOVAH,4CH;
INT21H
CODEENDS
ENDBEGIN
29.编写一个程序,实现键入任一个字符,显示其十进制的ASCⅡ码(例如:
键入A,显示41H)。
分析:
首先接受一个字符,其ASCⅡ码一定在0~255之间,把二进制的ASCH码转换为十进制后输出即可。
转换的算法是:
用该数除以100,商是二进制的百位;
再把余数除以10,商是二进制的十位;
余数是二进制的个位。
二进制的百位、十位、个位加上30H即为字符的百位、十位、个位,然后输出即可。
CODE
MOVAH,1
INT21H;
读一个按键
MOVAH,0;
准备做AX/100,所以要把AH清0
MOVBL,100;
除法指令不允许用立即数,把除数放在BL中
DIVBL;
除以100,商保存在AL中,余数保存在AH中(8位)
MOVCL,AL;
保存商,即百位数
ADDCL,30H;
把百位数转化成ASCⅡ码
MOVAL,AH;
取除以100的余数到BL中,作下一次的被除数
被除数高位部分清0
MOVBL,10;
准备除数10
除以10,商在AL中,余数在AH中
ADDAL,30H;
商是十位数,转换成ASCⅡ码(0-9对应ASCⅡ码为30H-39H
ADDAH,30H;
把余数个位数转换成ASCⅡ码
MOVBX,AX;
用BX保存转换后的十位和个位数字
MOVAH,2;
输出显示
MOVDL,13;
回车的ASCLL
输出回车
MOVDL,10
输出换行符
MOVDL,CL;
输出百位数
MOVDL,BL;
输出十位数
MOVDL,BH;
输出个位数
MOVAH,4CH
INT21H
ENDSTART
30.以BUF为首地址的存单元中存有1~15的平方表。
查表求X单元中数(在1~15之间)的平方值,并送回X单元。
表是一种常见的数据结构,平方表是一个数据表,为便于查表,需要组织好表的结构,即表中的平方值按顺序存放。
查表的方法是顺序查表法,以X为索引值,将索引值和平方表的首地址相加,其和作为表偏移地址,取出相应X的平方值。
NAMEEXAM3
BUFDB1,4,9,16,25,36,49,64
DB81,100,121,144,169,196,255
XDB12;
要查询的数,
STACKSEGMENTSTACK’STACK’
DB100DUP(?
STACKENDS
STACK;
段地址说明
MOVAX,DATA
MOVDS,AX;
MOVSI,OFFSETBUF;
取BUF(首地址)的偏移量
XORAX,AX;
AX清0
MOVAL,X;
DECAL;
AL=AL-1,的偏移地址
ADDSI,AX;
X平方值的地址(距表首地址的偏移量)
MOVAL,[SI];
取X的平方值
MOVX,AL
INT21H;
31.以BUF为首地址的存单元中,存放若干个8位的带符号数,统计≥0的数的个数,并将结果存入RESULT字节单元中。
BUFFDB1,-4,90,16,0,36,-49,-68
CNTEQU$-BUFF;
数据长度、符号数的总个数:
末尾数据后的一个地址-首地址
RESULTDB?
定义结果存放空间
STACKSEGMENTPARASTACK
ASSUMECS:
STACK;
LEASI,BUFF;
取BUFF(首地址)的偏移量
MOVDL,0;
DL清0
MOVCL,CNT;
取符号数的总个数,设置循环次数
LOP1:
MOVAL,[SI];
表中的数据按次序依次放入AL中
CMPAL,0;
和0比较
JLLOP2;
0时转移
INCDL;
=0,DL加一;
统计大于等于0的个数
LOP2:
INCSI;
修改地址指针(地址偏移量依次加一)
DECCL;
循环次数CL减1
JNZLOP1;
ZF>
0,CL不为0转移到LOP1
MOVRESULT,DL;
传送统计结果到存储单元
INT21H;
CODEENDS
32..设一个字节的二进制数存放在BINNUM单元中。
编写程序将它转换成十六进制数的形式显示在屏幕上。
显示字符用DOS的2号功能调用,要显示的字符的ASCⅡ码必须装入DL中。
因为4位二进制数对应1位十六进制数,一个字节的二进制数对应2位十六进制数。
十六进制数每位代码是0~9和A~F,对应的ASCⅡ码为30H~39H和41H~46H,因此程序中要判断该数的大小,若在0~9围,加上30H,若在A~F(10-15D)之间,则加上37H。
37H=30H+7H
BINSUMDB10001011B
MOVBL,BINSUM;
取二进制数
开始处理高4位
MOVCL,4;
设置移位次数
SHRDL,CL;
右移4位,取高4位
ADDDL,30H;
转换成ASCⅡ码(一部分0-9)(A-F还不够,差7)
CMPDL,‘9’;
与39H比较
JBEDONE1;
小于等于39H转移
ADDDL,7;
否则,为A-F,中则加7,转换为‘A’~‘F’
DONE1:
显示高4位
INT21H
ANDBL,0FH;
开始处理低4位
MOVDL,BL
CMPDL,41H;
和‘A’比较
JBLOP2;
小于‘A’时,为0-9,则转移
ADDDL,7;
否则,为A-F,则加7,转换为‘A’~‘F’
MOVAH,2;
显示低4位
33.编写一个汇编程序,求1~100的累加和。
程序功能简单,循环次数已经确定为100次,可以采用循环结构实现它。
CODESEGMENT
MOVAX,0;
和清零
MOVCX,100;
设置循环次数
ADDAX,CX;
求累加和
LOOPLOP1;
CX减1不为0,则转移
34.设VARY中有一组8位的符号数,编程统计其中的正数、负数、零的个数,分别存入VM、VN、VK变量中。
数组VARY中的数据个数用CNTEQU$-VARY求出,则循环次数为CNT次。
将数组VARY中的数据逐个与0比较,利用FR(标志寄存器)中的ZF求出零的个数,利用SF求出正、负数的个数。
参考程序如下:
VARYDB23H,78H,0ABH,0CDH,00H,56H
DB14H,86H,0EFH,0BCH,00H,0C0H
CNTEQU$-VARY;
$为末尾数后一位的地址,总数据个数,即循环次数
VMDB?
VNDB?
VKDB?
STACK
MOVBX,0;
初始化
清0
LEASI,VARY;
初始化地址指针
MOVCX,CNT;
;
循环体
CMPBYTEPTR[SI],0;
JEZERO;
等于0转ZERO
JSLOP2;
为负数转LOP2
INCBH;
统计正数个数的寄存器增1
JMPNEXT
INCBL;
统计负数个数的寄存器增1
ZERO:
统计0个数的寄存器增1
NEXT:
INCSI;
修改地址指针
LOOPLOP1;
判断终止条件,CX自减1,CX≠0则循环
结束处理部分
MOVVM,BH;
保存正数的个数
MOVVN,BL;
保存负数的个数
MOVVK,DL;
保存0的个数
INT21H;
35.编写程序,实现在同一行上依次显示26个大写字母.
MOVCX,26;
MOVDL,‘A’;
要显示的字符的ASCⅡ码必须装入DL中
显示字符用DOS的2号功能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 接口 技术 编程 指令 分析 详细