汇编语言小程序例子.docx
- 文档编号:4587857
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:21
- 大小:19.62KB
汇编语言小程序例子.docx
《汇编语言小程序例子.docx》由会员分享,可在线阅读,更多相关《汇编语言小程序例子.docx(21页珍藏版)》请在冰豆网上搜索。
汇编语言小程序例子
1.编写统计AX中1、0个数的源程序。
1的个数存入CH,0的个数存入CL。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVCX,0
MOVDX,17
AA1:
SUBDX,1
JZAA3
SHLAX,1
JNCAA2
INCCH
JMPAA1
AA2:
INCCL
JMPAA1
AA3:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.编写比较两个字符串STRING1和STRING2所含字符是否完全相同的源程序,若相同则显示“MATCH”,若不相同则显示“NOMATCH”。
程序:
DATASEGMENT
R1DB'MATCH',0AH,0DH
R2DB'NOMATCH',0AH,0DH
STRING1DB'XXXXX'
N1EQU$-STRING1
STRING2DB'YYYYY'
N2EQU$-STRING2
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,N1
CMPAX,N2
JNZAA1
ADDAX,1
LEASI,STRING1
LEADI,STRING2
AA2:
MOVBL,[SI]
MOVBH,[DI]
INCSI
INCDI
SUBAX,1
JZAA3
CMPBL,BH
JZAA2
JMPAA1
AA3:
LEABX,R1
MOVCX,7
AA4:
MOVDL,[BX]
INCBX
MOVAH,2
INT21H
LOOPAA4
JMPE
AA1:
LEABX,R2
MOVCX,10
AA5:
MOVDL,[BX]
INCBX
MOVAH,2
INT21H
LOOPAA5
E:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.
由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。
由于数字‘0’~‘9’的ASCⅡ码为30H~39H,字母‘a’~‘f’与‘A’~‘F’的ASCⅡ码为61H~66H与41H~46H,因此,如果输入的字母为数字‘0’~‘9’,则其低4位即为对应的二进制位;如果输入的字符为字母‘a’~‘f’或‘A’~‘F’,则需要减7,然后通过移位将低4位依次输出。
汇编程序如下:
DATASEGMENT
MSG1 DB 'Hex:
', '$'
MSG2 DB 0DH, 0AH, 'Binary:
', '$'
COUNTEQU4
BUFDB4DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,MSG1
MOVAH,9
INT21H
MOVCX,COUNT
MOVSI,0
INPUT:
;通过四次循环从键盘读入四位十六进制数
MOVAH,1
INT21H
MOVBUF[SI],AL
DECCX
INCSI
CMPCX,0
JNZINPUT
NEXT3:
LEADX,MSG2
MOVAH,9
INT21H
MOVCX,COUNT
MOVSI,0
NEXT2:
MOVBL,BUF[SI]
CMPBL,'9'
JBEOK;读入的字符<=9 转向 OK:
SUBBL,7 ;读入字符>=9减7
OK:
PUSHCX
MOVCL,4
SHLBL,CL;逻辑左移4位,低4位à高4位
MOVCX,4;4次循环将当前处理字符的4位二进制输出
NEXT1:
MOVDL,'0'
SHLBL,1
JNCSKIP
INCDL
SKIP:
MOVAH,2
INT21H
LOOPNEXT1
POPCX;
INCSI
LOOPNEXT2;4次循环将4位十六进制数,每位转换为对应的4位二进制
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4.设从STRING开始存放一个以$为结束标志的字符串,试编写把字符串中的字符进行分类的源程序,数字字符送入NUM开始的内存中,大写字母送入BCHAR开始的内存区中,小写字母存入LCHAR开始的内存中,其他字符存入OTHER开始的内存区中。
DATASEGMENT
STRINGDB'abc123ABC','$'
NEQU$-STRING
NUMDBNDUP(?
)
BCHARDBNDUP(?
)
LCHARDBNDUP(?
)
OTHERDBNDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEABX,STRING
DECBX
LEASP,BCHAR
LEACX,LCHAR
LEADX,OTHER
LEASI,NUM
AA1:
INCBX
MOVAL,[BX]//判断是否为$,是否结束
CMPAL,’$’
JZAA5
CMPAL,30H//判定数字字符
JCAA4
CMPAL,39H
JAAA2
MOV[SI],AL
INCSI
JMPAA1
AA2:
CMPAL,41H//判定大写字母
JCAA4
CMPAL,5AH
JAAA3
MOVDI,SP
MOV[DI],AL
INCSP
JMPAA1
AA3:
CMPAL,61H//判定小写字母
JCAA4
CMPAL,7AH
JAAA4
MOVDI,CX
MOV[DI],AL
INCCX
JMPAA1
AA4:
MOVDI,DX//判定其他
MOV[DI],AL
INCDX
JMPAA1
AA5:
MOVAH,4CH//返回DOS结束
INT21H
CODEENDS
ENDSTART
5.试编写找出首地址为BUF数据块中的最小偶数(该数据块中有100个带符号字节数),并以十六进制的形式显示在CRT上的源程序。
答:
DATASEGMENT
BUFDB100DUP(?
);要比较的数
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEABX,BUF;BUF首地址送BX
MOVCL,101;循环控制
MOVDL,126;DL存放最小偶数
MOVAH,0;标志是不是有偶数
LOOP1:
DECCL;循环计数减1
JZTOEND;ZF标志0则跳转
MOVAL,[BX];BX内存内容送AL
INCBX;BX指向下一内存单元
SHRAL,1;AL逻辑右移一位
JCLOOP1;是基数则接着循环
SHLAL,1;是偶数,因为上面右移了左移得到原数值
MOVAH,1;能进行这一步则说明数值中有偶数
CMPAL,DL;与CH比较大小
JGELOOP1;AL大DL小则循环
MOVDL,AL;保证DL存放最小偶数
JMPLOOP1;CL不为0继续循环
TOEND:
CMPAH,1
JCL;有借位则说明数值中无偶数直接返DOS
MOVBL,DL
SHRDL,1
SHRDL,1
SHRDL,1
SHRDL,1
ANDDL,0FH
CMPDL,10
JBL4
ADDDL,7
L4:
ADDDL,30H;显示高四位对应的十六进制的ascii码
MOVAH,2
INT21H
MOVDL,BL
ANDDL,0FH
CMPDL,10
JBL6
ADDDL,7
L6:
ADDDL,30H;显示低四位对应的十六进制的ascii码
MOVAH,2
INT21H
MOVDL,'H';显示H
MOVAH,2
INT21H
L:
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
6.已知数据块BUFA中存放15个互不相等的字节数据,BUFB中存放20个互不相等的字节数据,试编写将既在BUFA中出现,又在BUFB中出现的数据存放到BUFC开始的缓冲区中的源程序。
答:
DATASEGMENT
BUFADB41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FH
BUFBDB31H,32H,33H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH
DB50H,51H,52H,53H,54H
BUFCDB15DUP(0)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,BUFA
LEABX,BUFC
MOVCX,15;外层循环计数
AA1:
MOVAH,20;内层循环20次
MOVAL,[SI]
LEADI,BUFB
AA2:
CMPAL,[DI]:
比较BUFA,BUFB内容
JNZAA3;内容不同,跳至AA3
MOV[BX],AL;内容相同,将其存入BUFC单元
INCBX
JMPAA4;找到相同内容,结束本次内层循环
AA3:
INCDI
DECAH;内层循环计数减一
JNZAA2;内层循环结束
AA4:
INCSI
LOOPAA1;外层循环结束
MOVCX,15;此行以下将BUFC中的内容输出
LEABX,BUFC
BB1:
MOVDL,[BX]
INCBX
MOVAH,2
INT21H
LOOPBB1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
7.试编写由键盘输入一个以回车作为结束的字符串,将其按ASCII码由大到小的顺序输入到CRT上的源程序。
答:
DATASEGMENT;数据段
BUFDB200DUP(?
)
DATAENDS
CODESEGMENT;代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDI,0;记录输入的字符串个数
MOVBX,OFFSETBUF
AA1:
MOVAH,1;键盘输入字符
INT21H
CMPDI,201;是否超出缓冲区
JNCAA6;超过缓冲区大小
CMPAL,0DH;是否为回车,回车表输入结束
JZAA6;是回车
MOV[BX],AL;将字符存入缓冲区
INCBX
INCDI
JMPAA1
AA6:
MOVDX,DI
CMPDI,0;没有字符则无输出
JZAA7
CMPDI,1;有一个字符则直接输出
JZAA8
DECDX;外循环计数初值,即遍数,数据个数减1
AA2:
MOVBX,OFFSETBUF
MOVCX,DI
DECCX;内循环计数初值,即比较次数,数据个数减1
AA3:
MOVAL,[BX]
CMPAL,[BX+1];比较
JNCAA4;前大后小转
XCHGAL,[BX+1];前小后大交换
MOV[BX],AL
AA4:
INCBX
LOOPAA3
DECDX
JNZAA2
AA8:
MOVBX,OFFSETBUF;输出字符
MOVCX,DI;循环计数初值
AA5:
MOVDL,[BX]
MOVAH,2
INT21H
INCBX
LOOPAA5
AA7:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
8.设从BUFFER开始存放若干个以$为结束标志的带符号字节数据,试编写将其中的正数按由大到小的顺序存入PLUS开始的缓冲区中的源程序。
答:
方法一
思路:
将正数先存到目标地址,然后再排序。
DATASEGMENT
BUFFERDB1,2,3,4,5,6,7,-8,9,2,-1,-2,-3,-4,-5,-6,-7,-8,-9,1,'$'
PLUSDB(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDI,-1;初始化外循环计数器
LEABX,BUFFER
LEASI,PLUS
L1:
MOVAL,[BX]
XORAL,'$';判断当前字符是否为'$'
JNZL2;不是'$'转移
JMPL4
L2:
MOVAL,[BX];判断当前字符是否为正数
ROLAL,1
JNCL3;是正数转移
INCBX
JMPL1
L3:
RORAL,1;恢复数据
MOV[SI],AL;将数据存入目标地址
INCDI
INCSI
INCBX
JMPL1
L4:
CMPDI,0
JGL5;正数个数>=2则开始排序
MOVAH,4CH
INT21H;正数个数为0或1均跳出
L5:
LEASI,PLUS;以下为使用冒泡排序的方法对数据排序
MOVCX,DI
L6:
MOVAL,[SI]
CMPAL,[SI+1]
JNCL7
XCHGAL,[SI+1]
MOV[SI],AL
L7:
INCSI
LOOPL6
DECDI
JNZL5
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
方法二
思路:
在数据存放的原地址将数据进行由小到大的冒泡排序,则每次那循环可得到本次排序中的最大数,将其存入目的地址,直到得到一个非正的数后跳出。
DATASEGMENT
BUFFERDB1,2,3,4,5,6,7,-8,9,2,-1,-2,-3,-4,-5,-6,-7,-8,-9,1,'$'
PLUSDB(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDI,-1;初始化外循环计数器
LEASI,PLUS
LEABX,BUFFER
L1:
MOVAL,[BX]
XORAL,'$';检查当前字符是否为'$'
JNZL2
JMPL3
L2:
INCDI
INCBX
JMPL1
L3:
LEABX,BUFFER;开始排序
MOVCX,DI
L4:
MOVAL,[BX]
CMPAL,[BX+1]
JLEL5;前小后大转移
XCHGAL,[BX+1]
MOV[BX],AL
L5:
INCBX
LOOPL4
MOVAL,[BX];得到本次循环的最大数
ROLAL,1
JNCAA4;检验是否为正数,是则转移
MOVAH,4CH
INT21H
L6:
MOVDL,[BX]
MOV[SI],DL;保存数据
INCSI
DECDI
JNZL3;进入下一次循环
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
9.试编写一源程序,要求将一个包含有20个数据的数组M分成两个数组:
正数数组P和负数组N,并分别把这两个数组中数据的个数在CRT上显示出来。
答:
DATASEGMENT
ORG100H
MDB12,23,58,15,36,55,44,89,45,-23,-56,-47,-21,-65,32,69,82,58,29,-14;待处理数组
PDB20DUP(?
);正数数组P
NDB20DUP(?
);负数数组N
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,P;P的首址送SI
LEADI,N;N的首址送DI
LEABX,M;M的首址送BX
XORAX,AX;AX清0
XORDX,DX;DX清0,DL/DH分别用于正/负数计数
MOVCX,20;分别处理M的20个数据
L1:
MOVAL,[BX];取一个数组元素
TESTAL,80H;AL,80H按位与
JZL2;结果为0,则AL为正,转L2
MOV[DI],AL;AL为负,送负数数组N
INCBX;BX+1,准备取M的下一个元素
INCDI;负数数组N写位置后移一位
INCDH;负数计数DH+1
JMPL3;本次处理结束
L2:
MOV[SI],AL;AL为正,送正数数组P
INCBX
INCSI;正数数组P写位置后移一位
INCDL;正数计数DL+1
L3:
LOOPL1;跳转进入下一次循环
MOVCX,2;二次输出循环,分别显示正负数的个数
L5:
MOVBL,DL;保存DL,实质是暂时保存DL的低4位
SHRDL,1
SHRDL,1
SHRDL,1
SHRDL,1;逻辑右移4位,即取高4位
CMPDL,10
JBL4;DL<10
ADDDL,7;DL>=10时,DL+7,9的ASCII码为39H,A的ASCII码为41H,相差8
L4:
ADDDL,30H
MOVAH,2;输出DL,正/负数个数的高位
INT21H
MOVDL,BL;BL送DL,准备显示正/负数个数的低位
ANDDL,0FH;DL高4位置0,因为DL的高4位已显示
CMPDL,10
JBL6
ADDDL,7
L6:
ADDDL,30H
MOVAH,2
INT21H
MOVDL,0AH;换行
MOVAH,2
INT21H
MOVDL,0DH;回车
MOVAH,2
INT21H
MOVDL,DH;DH送DL,准备显示负数的个数
LOOPL5
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
10.试编写一源程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。
答:
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,1;输入一个个位数N
INT21H
CMPAL,30H
JCSTART;小于0,要求重新输入
CMPAL,3AH
JNCSTART;大于9,要求重新输入
ANDAL,0FH
XORCX,CX;CX清0
MOVCL,AL;循环响铃N次
MOVDL,07H;响铃的ASCII码为07
AA1:
MOVAH,2
INT21H
LOOPAA1;循环响铃
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
11.在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否有数字。
如有,则把CL置0FFH,否则将CL置0。
答:
DATASSEGMENT
STRINGDB'XYZIL12LWR';''内可以是任意字符串
NEQU$-STRING;字符串长度
DATASENDS
;
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVCX,N
LEABX,STRING
AA1:
MOVAL,[BX]
CMPAL,30H;字符ASCII码小于30H,转移
JBAA2
CMPAL,39H;字符ASCII码大于39H,转移
JAAA2
JMPAA3;数字,符合条件
AA2:
INCBX
LOOPAA1
MOVCL,0
JMPAA4
AA3:
MOVCL,0FFH
AA4:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
12.试编制一源程序,把DX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的4个字符中.例如,当DX=2A49H时,程序执行完后,MEM中的4个字节内容为39H、34H、41H、和32H。
答:
DATASEGMENT
SOURCEDW2A49H
MEMDB4DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
;
START:
MOVAX,DATA
MOVDS,AX
;
MOVDX,SOURCE
LEABX,MEM
;
;settheloop
MOVCX,4
;theloopbody
LB:
MOVAX,DX
ANDAX,000FH
CMPAL,10
JCAD
;
ADDAL,7
;
AD:
ADDAL,30H
MOV[BX],AL
INCBX
;
SHRDX,1
SHRDX,1
SHRDX,1
SHRDX,1
LOOPLB
;theloopend,returntodos
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
13.下面程序段是实现从键盘输入10个1位10进制数后累加。
最后累加和以非压缩BCD码形式存放在AH(高位)和AL(低位)中。
答:
XORDX,DX
MOVCX10
LOP1:
MOVAH,01H;键盘字符输入
INT21H
MOVAH,DH
ADDAL,DL
AAA
MOVDX,AX
LOOPLOP1
..
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序 例子
![提示](https://static.bdocx.com/images/bang_tan.gif)