汇编语言程序设计PPT推荐.ppt
- 文档编号:7130376
- 上传时间:2023-05-08
- 格式:PPT
- 页数:100
- 大小:455KB
汇编语言程序设计PPT推荐.ppt
《汇编语言程序设计PPT推荐.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计PPT推荐.ppt(100页珍藏版)》请在冰点文库上搜索。
,例把两个字节存储单元X和X+1中低4位存储的两个0到9之间的数(非压缩BCD码)合并成一个压缩BCD码,结果存放到字节单元Y中。
解:
程序如下:
DATASEGMENT;
数据段XDB5,7YDB?
DATAENDSCODESEGMENT;
代码段ASSUMECS:
DATASTARTPROCFAR;
定义FAR类型过程PUSHDS;
预留返回DOS地址MOVAX,0PUSHAX,MOVAX,DATA;
初始化DSMOVDS,AXMOVAL,X;
取BCD码的高4位数MOVCL,4SHLAL,CLMOVBL,X+1;
取BCD码的低4位ANDBL,0FHORAL,BL;
合并结果;
能否改为XOR或ADDMOVY,AL;
存BCD码到Y单元,RETSTARTENDPCODEENDSENDSTART;
源程序结束,例把一个字单元的4位BCD码转换成二进制数。
CODESEGMENTUSE16ASSUMECS:
CODEBCD_NUMDW4567H;
4567H=7+10*(6+10*(5+10*(4+10*0)BEG:
MOVCX,4MOVAX,0;
存放中间结果AGAIN:
ROLBCD_NUM,4MOVBX,BCD_NUMANDBX,000FH;
依次取出BCD_NUM的千、百、十、个位的BCD码CALLMUL10LOOPAGAIN,DISP:
MOVBP,AXMOVCX,16LAST:
MOVAL,0RCLBP,1ADCAL,0MOVAH,0EHINT10HLOOPLASTMOVAH,4CHINT21H,MUL10PROCMOVDX,10MULDXADDAX,BX;
乘积的高16位存放在DX,始终为0RETMUL10ENDPCODEENDSENDBEG,特例:
一个不大于99的BCD数可以直接用AAD指令求出等值的二进制数。
MOVAX,0908HAAD,进制转换,进制转换过程中经常利用代码转换。
例把一个16位二进制数转换成十六进制数显示。
.486DATASEGMENTUSE16NUMDW0001101000101011B;
1A2BHBUFDB4DUP(?
),H$DATAENDSCODESEGMENTUSE16ASSUMECS:
DATABEG:
MOVAX,DATAMOVDS,AXMOVSI,OFFSETBUF;
存放转换后的16进制数ASCII码,MOVDX,NUM;
取出二进制数SALEDX,16MOVCX,4;
一个16位二进制数包括4位16进制数LP:
ROLEDX,4;
图示EDX/DX/DL变化ANDDL,0FH;
DL低4位二进制必定介于015CMPDL,10JBNEXTNEXT:
ADDDL,30H;
09的ASCII介于30H39H、与数值09相差30HMOVSI,DLINCSILOOPLP,MOVDX,NUM;
DL低4位二进制必定介于015CMPDL,10JBNEXTADDDL,7;
A的ASCII与10相差:
37HNEXT:
09的ASCII介于30H39H、与数值09相差30HMOVSI,DLINCSILOOPLP,MOVAH,9MOVDX,OFFSETBUFINT21HMOVAH,4CHINT21HCODEENDSENDBEG,例二进制数转换成十进制数显示。
二进制数转换成十进制数有多种方法,即比较法、恢复余数法和除法求余。
8位二进制数转换比较法程序清单思路:
需要注意:
必须事先确定:
操作数的字长!
CMPDISPMACRONNLOCALLAST,NEXTMOVDL,0LAST:
CMPBEN,NNJCNEXTINCDLSUBBEN,NNJMPLASTNEXT:
ADDDL,30HMOVAH,2INT21HENDM,CODESEGMENTUSE16ASSUMECS:
CODEBENDB10101110B;
等于十进制数174BEG:
CMPDISP100;
求百位上的数字CMPDISP10;
求十位上的数字CMPDISP1;
求个位上的数字MOVAH,4CHINT21HCODEENDSENDBEG,特例:
一个不大于99的二进制数,转换成十进制数显示更简单。
MOVAX,01100010B;
AH=0,AL=98AAM;
AH=09H,AL=08HADDAX,3030H;
AH-39H,AL=38HPUSHAXROLAX,8;
AH=38H,AL=39HMOVAH,0EHINT10H;
0E号10H的BIOS调用等价与2号DOS功能调用,显示一个字符(其ASCII码放在AL中)POPAXMOVAH,0EHINT10H,除法求余法。
把一个32位二进制数转换成十进制数、并显示在显示器上。
.486CODESEGMENTUSE16ASSUMECS:
CODENUM32DD3456789000BEG:
MOVEAX,NUM32MOVEBX,10;
除数是32位10,能否视为16位的10?
;
注意:
必须把10视为32位数!
如果把除数10视为16位,则商用16位放不下。
MOVCX,0;
动态统计:
将要显示的十进制数的位数!
高位的0无需显示,但如果32位数是全0则要显示唯一的一位0;
因此CX至少为1,LAST:
MOVEDX,0;
被除数64位、高半部分为0DIVEBX;
除法结果的余数在EDXPUSHDX;
保存余数;
余数本来存放在32位的EDX;
因为余数10,因此余数实际上就在DL中!
能否使用PUSHDL?
INCCX;
即将显示的位数加1,至少显示1位CMPEAX,0;
EAX保存商,注意:
除法结束的条件JNZLAST;
如果商为0,退出循环!
;
根据堆栈中的余数:
逆序显示AGA:
POPDXADDDL,30H;
把每个余数转换成对应的ASCII码MOVAH,2INT21H;
逐一显示余数LOOPAGA;
循环显示次数就是CX中:
十进制数的位数!
MOVAH,4CHINT21HCODEENDSENDBEG,思考:
源代码中的操作数:
是否可以改为其他进制?
是否可以改为负数?
类似于C语言的自动类型转换:
shortinta=-3;
unsignedshortintb=a;
b=?
例把BX中的16位二进制数转换成十进制并显示在屏幕上。
(寄存器参数传递)STASGSEGMENTDW32DUP(?
)STASGENDSCODESEGMENTASSUMECS:
CODEMAINPROCFARMOVBX,162EHCALLTERNMOVAX,4C00HINT21HMAINENDP,TERNPROC;
二十并显示。
MOVCX,10000CALLDEC_DIV;
转换万位数MOVCX,1000CALLDEC_DIV;
转换千位数MOVCX,100CALLDEC_DIV;
转换百位数MOVCX,10CALLDEC_DIV;
转换十位数MOVCX,1CALLDEC_DIV;
转换个位数RETTERNENDP,DEC_DIVPROC;
CX中为十进制的位权MOVAX,BXMOVDX,0DIVCX;
商为转换后的一位十进制数MOVBX,DXMOVDL,ALADDDL,30H;
转换成ASCII码MOVAH,2;
显示INT21HRETDEC_DIVENDPCODEENDSENDMAIN,数值计算,例:
两个4字节组合BCD码数加法,.486DATASEGMENTUSE16XXDD13572468HYYDD55667788HSUMDB?
?
增加一个字节,用于存放进位值00或01DATAENDSCODESEGMENTUSE16ASSUMECS:
MOVAX,DATAMOVDS,AX,MOVSI,OFFSETXXMOVDI,OFFSETYYMOVBX,OFFSETSUM+4;
为什么要加4?
;
低位结果先得、但后显示CLCMOVCX,4BCD_ADD:
MOVAL,SIADCAL,DIDAAMOVBX,ALINCSIINCDI;
指向高地址、高位;
DECBXLOOPBCD_ADD,ADCCL,0MOVBX,CL;
保存最高位的进位CALLDISPMOVAH,4CHINT21H,DISPPROC;
显示10位BCD码数的结果;
每个存储单元的内容显示2位结果(高、低4位)MOVCX,5MOVBX,OFFSETSUMLLL:
MOVDH,BXROLDX,4;
DL低4位为即将处理的一位BCDANDDL,0FH;
DL高4位清0ADDDL,30HMOVAH,2INT21H;
显示一位BCDROLDX,4ANDDL,0FHADDDL,30HMOVAH,2INT21H;
显示压缩BCD码的第二位INCBX;
指向下一个压缩BCD码LOOPLLL,RETDISPENDPCODEENDSENDBEG,例求解一个正整数的近似平方根。
CODESEGMENTUSE16ASSUMECS:
CODEBEG:
MOVEAX,77CALLSQRTADDCL,30HMOVAH,2MOVDL,CLINT21H;
假设平方根只有一位十进制数MOVAH,4CHINT21H,SQRTPROCMOVECX,0LAST:
MOVEDX,ECXADDEDX,ECXINCEDXSUBEAX,EDXJCEXITINCECXJMPLASTEXIT:
RETSQRTENDPCODEENDSENDBEG,;
入口参数放在EAX中,出口参数是平方根,放在CX(本来存放在EAX,但是其高16位为0,因为假设是所求的平方根是一位十进制数),数据处理,数据处理涉及的面比较宽,包括字符串处理、表格处理等范畴。
数据表由若干表项组成。
根据表项的内容可以分为无序表和有序表两种。
在无序表中的各个表项的数值排列是无序的;
而在有序表中的各个表项的数值按照数值大小依次的有序排列。
表格处理涉及到数据查找、插入、删除、排序和数据表转换等操作。
查表是最基本的操作,查表的方法包括顺序查表、计算查表和对半搜索等。
例:
为7位标准ASCII码设置一个奇校验位,解法1.486DATASEGMENTUSE16STRINGDBTHEQUICKBROWNFOXJUMPSOVERLAZYDOGCOUNTEQU$-STRINGDATAENDSEXTRASEGMENTUSE16BUFDBCOUNTDUP(?
)EXTRAENDS,CODESEGMENTUSE16ASSUMECS:
DATA,ES:
EXTRABEG:
MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXMOVCX,COUNTMOVSI,OFFSETSTRINGMOVDI,OFFSETBUFCLDLOAD:
LODSBANDAL,AL;
AL不变,影响状态标志JNPSTOREORAL,80H;
AL最高位置1,STORE:
STOSBLOOPLOADMOVAH,4CHINT21HCODEENDSENDBEG,解法2清单没有为ES设置单独的逻辑段,直接对ES赋值。
即:
DS与ES重叠!
DATASEGMENTUSE16BUFDBCOUNTDUP(?
)DATAENDSCODESEGMENTUSE16.BEG:
MOVAX,DATAMOVDS,AXMOVES,AX,例:
数据查找(无序表),例:
内存缓冲区从BUF+1开始存有若干个单字节的有符号数,其个数放在BUF单元,要求找出最大数送到MAX单元,最小数送到MIN单元。
.486DATASEGMENTUSE16BUFDB8,34,56,-1,7FH,-88,200,22,80HMAXDB?
MINDB?
DATAENDSCODESEGMENTUSE16ASSUMECS:
DATA,BEG:
MOVAX,DATAMOVDS,AXMOVCH,0MOVCL,BUF;
不可合并DECCX;
只需要比较(BUF)-1次MOVAL,BUF+1MOVMAX,AL;
假设第一个数即是所求MOVMIN,ALMOVBX,OFFSETBUF+2LAST:
MOVAL,BXCMPAL,MAXJGGREAT,CMPAL,MINJLLESSJMPNEXTGREAT:
MOVMAX,ALJMPNEXTLESS:
MOVMIN,ALNEXT:
INCBXLOOPLASTMOVAH,4CHINT21HCODEENDSENDBEG,例:
逆序显示一个字符串1,;
要求用户从键盘上输入一个字符个数不超过60的字符串,然后以相反次序显示在屏幕上。
DATASEGMENTUSE16MESGDBINPUTYOURSTRING:
$BUFDB60DB?
DB60DUP(?
)DATAENDSCODESEGMENTUSE16ASSUMECS:
MOVAX,DATAMOVDS,AX,AGAIN:
MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,0AHMOVDX,OFFSETBUFINT21HMOVDL,10MOVAH,2INT21H;
换行,MOVCL,BUF+1MOVCH,0MOVSI,OFFSETBUF+2ADDSI,CXDECSI;
指向最后一个有效字符LP:
MOVDL,BYTEPTRSIMOVAH,2INT21HDECSILOOPLP,MOVAH,4CHINT21HCODEENDSENDBEG,例:
逆序显示一个字符串2,;
递归子程序方式逆序显示字符串DATASEGMENTABCDBABC123asdfLENEQU$-ABCDATAENDSSTACK1SEGMENTTEMPDB20DUP(?
)STACK1ENDS,CODESEGMENTASSUMECS:
DATA,SS:
STACK1START:
MOVAX,DATAMOVDS,AXMOVCX,LENCALLSUB1;
参数为ABC及CXMOVAH,4CHINT21HCODEENDSENDSTART,CODE1SEGMENTASSUMECS:
CODE1SUB1PROCFARPUSHCXDECCXCMPCX,0JENEXTCALLSUB1NEXT:
MOVSI,OFFSETABCADDSI,LEN-1SUBSI,CXMOVDL,DS:
SIMOVAH,2INT21HPOPCXRETSUB1ENDPCODE1ENDS,例:
删除第一个关键字,设NUM单元为数据个数;
NUM+1单元开始是一张无序表,请查找数KEY是否在数列中:
若是,则从数列中删除、第一个该数。
DATASEGMENTUSE16NUMDB9,A1B2C3E45KEYDBEDATAENDSCODESEGMENTUSE16ASSUMECS:
MOVAX,DATAMOVDS,AXMOVES,AX,MOVAL,KEY;
关键字放ALMOVCH,0MOVCL,NUM;
不能合并MOVDI,OFFSETNUM+1;
指向第一个字符CLDREPNESCASB;
执行搜索JNZEXIT;
如果ZF=0:
未搜索到关键字、结束;
如果ZF=1:
则CX剩余字节数;
且DI指向关键字的下一个存储单元MOVSI,DIDECDIREPMOVSB;
复制剩余子串、完成删除操作DECNUM;
剩余字符数减1CALLDISP,EXIT:
MOVAH,4CHINT21HDISPPROCMOVKEY-1,$MOVAH,9MOVDX,OFFSETNUM+1INT21HRETDISPENDPCODEENDSENDBEG,例:
删除所有的关键字1,;
设NUM单元为数据个数;
NUM+1单元开始是一张无序表。
查找数组中是否存在数KEY:
若是,则从数组中删除、所有的该数!
思路1:
循环执行:
搜索串中关键字、复制剩余子串。
.486DATASEGMENTUSE16NUMDB13,EA1EB2C3EE45EKEYDBEDATAENDSCODESEGMENTUSE16ASSUMECS:
MOVAX,DATAMOVDS,AXMOVES,AXMOVAL,KEYMOVBX,0;
统计字符串中关键字个数、以利于显示处理CLDNEXT:
MOVCH,0MOVCL,NUMMOVDI,OFFSETNUM+1REPNESCASBJNZEXIT,MOVSI,DIDECDIREPMOVSBDECNUMDECBX;
减法:
便于后续显示JMPNEXT;
无需确定次数:
反复删除关键字EXIT:
CALLDISP,MOVAH,4CHINT21HDISPPROCMOVBX+KEY,$MOVAH,9MOVDX,OFFSETNUM+1INT21HRETDISPENDPCODEENDSENDBEG,例:
删除所有的关键字2,;
循环复制剩余子串、低效;
思路2:
一次遍历。
逐个字符判断、如果不是则复制该字符;
.486DATASEGMENTUSE16NUMDB15,EEA1EB2C3EE45EEKEYDBEDATAENDSCODESEGMENTUSE16ASSUMECS:
MOVAX,DATAMOVDS,AXMOVES,AXLEASI,NUM+1;
SI指向源字符MOVDI,SI;
DI指向目的字符CLDMOVCH,0MOVCL,NUMMOVBX,0;
统计字符串中被删除的关键字个数、以利于显示处理,LP:
LODSB;
逐一读入源字符:
不是关键字则保存、否则不处理:
一次遍历即可!
SI自动指向下一个字符CMPAL,KEYJENEXTSTOSB;
非关键字时:
复制;
DI自动指向下一个存储位置JMPLP1NEXT:
等于关键字:
不复制DECNUM;
剩余字符数减1DECBX;
地址减法:
便于后续显示LP1:
LOOPLPCALLDISP,MOVAH,4CHINT21HDISPPROCMOVBX+KEY,$MOVAH,9MOVDX,OFFSETNUM+1INT21HRETDISPENDPCODEENDSENDBEG,例:
命令行参数的传递技术,程序使用参数用两种方法:
人机对话和命令行。
在命令行方式下执行的用户程序可以带有参数,并以回车键表示结束。
除了用户程序名之外的字符即命令行参数(从命令名后的第一个空格字符开始,到回车键结束,包括回车键)。
DOS操作系统将一个可执行文件载入主存时,会自动在用户程序上方即低地址处创建一个包含256个字节的PSP。
PSP表示程序段前缀的段基址。
其中,PSP+80H保存命令行参数的字符的个数(不包括回车键字符)。
从PSP+81H的存储单元开始存放实际输入的参数字符的ASCII码(包括回车键字符)。
关键:
利用初始的DS值(等于PSP)处理参数,然后才能修改DS。
DATASEGMENTUSE16BUFDB127DUP(?
);
ASCII码0显示结果类似于空格DB$DATAENDSCODESEGMENTUSE16ASSUM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计