汇编语言小程序例子Word文档格式.docx
《汇编语言小程序例子Word文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言小程序例子Word文档格式.docx(22页珍藏版)》请在冰点文库上搜索。
INCDI
SUBAX,1
CMPBL,BH
JZAA2
JMPAA1
LEABX,R1
MOVCX,7
AA4:
MOVDL,[BX]
INCBX
MOVAH,2
LOOPAA4
JMPE
LEABX,R2
MOVCX,10
AA5:
LOOPAA5
E:
ENDSTART
3.从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.
由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。
由于数字'
0'
~'
9'
的ASCⅡ码为30H~39H,字母'
a'
~'
f'
与'
A'
F'
的ASCⅡ码为61H~66H与41H~46H,因此,如果输入的字母为数字'
,则其低4位即为对应的二进制位;
如果输入的字符为字母'
a'
f'
或'
A'
F'
,则需要减7,然后通过移位将低4位依次输出。
汇编程序如下:
MSG1 DB '
Hex:
'
'
$'
MSG2 DB 0DH, 0AH, '
Binary:
COUNTEQU4
BUFDB4DUP(?
)
MOVAX,DATA
MOVDS,AX
LEADX,MSG1
MOVAH,9
MOVCX,COUNT
MOVSI,0
INPUT:
;
通过四次循环从键盘读入四位十六进制数
MOVAH,1
MOVBUF[SI],AL
DECCX
CMPCX,0
JNZINPUT
NEXT3:
LEADX,MSG2
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
LOOPNEXT1
POPCX;
LOOPNEXT2;
4次循环将4位十六进制数,每位转换为对应的4位二进制
EXIT:
MOVAH,4CH
CODEENDS
4.设从STRING开始存放一个以$为结束标志的字符串,试编写把字符串中的字符进行分类的源程序,数字字符送入NUM开始的内存中,大写字母送入BCHAR开始的内存区中,小写字母存入LCHAR开始的内存中,其他字符存入OTHER开始的内存区中。
STRINGDB'
abc123ABC'
'
NEQU$-STRING
NUMDBNDUP(?
BCHARDBNDUP(?
LCHARDBNDUP(?
OTHERDBNDUP(?
MOVAX,DATA
LEABX,STRING
DECBX
LEASP,BCHAR
LEACX,LCHAR
LEADX,OTHER
LEASI,NUM
INCBX
MOVAL,[BX]//判断是否为$,是否结束
CMPAL,'
JZAA5
CMPAL,30H//判定数字字符
JCAA4
CMPAL,39H
JAAA2
MOV[SI],AL
CMPAL,41H//判定大写字母
CMPAL,5AH
JAAA3
MOVDI,SP
MOV[DI],AL
INCSP
CMPAL,61H//判定小写字母
CMPAL,7AH
JAAA4
MOVDI,CX
INCCX
MOVDI,DX//判定其他
MOV[DI],AL
INCDX
MOVAH,4CH//返回DOS结束
5.试编写找出首地址为BUF数据块中的最小偶数(该数据块中有100个带符号字节数),并以十六进制的形式显示在CRT上的源程序。
答:
BUFDB100DUP(?
);
要比较的数
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
ANDDL,0FH
CMPDL,10
JBL4
ADDDL,7
L4:
ADDDL,30H;
显示高四位对应的十六进制的ascii码
MOVDL,BL
JBL6
L6:
显示低四位对应的十六进制的ascii码
MOVDL,'
H'
;
显示H
L:
MOVAH,4CH;
返回DOS
6.已知数据块BUFA中存放15个互不相等的字节数据,BUFB中存放20个互不相等的字节数据,试编写将既在BUFA中出现,又在BUFB中出现的数据存放到BUFC开始的缓冲区中的源程序。
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)
LEASI,BUFA
LEABX,BUFC
MOVCX,15;
外层循环计数
MOVAH,20;
内层循环20次
MOVAL,[SI]
LEADI,BUFB
CMPAL,[DI]:
比较BUFA,BUFB内容
JNZAA3;
内容不同,跳至AA3
MOV[BX],AL;
内容相同,将其存入BUFC单元
JMPAA4;
找到相同内容,结束本次内层循环
DECAH;
内层循环计数减一
JNZAA2;
内层循环结束
LOOPAA1;
外层循环结束
此行以下将BUFC中的内容输出
BB1:
LOOPBB1
7.试编写由键盘输入一个以回车作为结束的字符串,将其按ASCII码由大到小的顺序输入到CRT上的源程序。
DATASEGMENT;
数据段
BUFDB200DUP(?
DATAENDS
CODESEGMENT;
代码段
ASSUMECS:
CODE,DS:
START:
MOVAX,DATA
MOVDS,AX
MOVDI,0;
记录输入的字符串个数
MOVBX,OFFSETBUF
AA1:
MOVAH,1;
键盘输入字符
CMPDI,201;
是否超出缓冲区
JNCAA6;
超过缓冲区大小
CMPAL,0DH;
是否为回车,回车表输入结束
JZAA6;
是回车
MOV[BX],AL;
将字符存入缓冲区
AA6:
MOVDX,DI
CMPDI,0;
没有字符则无输出
JZAA7
CMPDI,1;
有一个字符则直接输出
JZAA8
DECDX;
外循环计数初值,即遍数,数据个数减1
AA2:
MOVCX,DI
DECCX;
内循环计数初值,即比较次数,数据个数减1
AA3:
MOVAL,[BX]
CMPAL,[BX+1];
比较
JNCAA4;
前大后小转
XCHGAL,[BX+1];
前小后大交换
MOV[BX],AL
AA4:
LOOPAA3
DECDX
JNZAA2
AA8:
MOVBX,OFFSETBUF;
输出字符
MOVCX,DI;
循环计数初值
AA5:
MOVDL,[BX]
MOVAH,2
AA7:
MOVAH,4CH
8.设从BUFFER开始存放若干个以$为结束标志的带符号字节数据,试编写将其中的正数按由大到小的顺序存入PLUS开始的缓冲区中的源程序。
方法一
思路:
将正数先存到目标地址,然后再排序。
BUFFERDB1,2,3,4,5,6,7,-8,9,2,-1,-2,-3,-4,-5,-6,-7,-8,-9,1,'
PLUSDB(?
CODE,DS:
DATA
MOVDI,-1;
初始化外循环计数器
LEABX,BUFFER
LEASI,PLUS
L1:
MOVAL,[BX]
XORAL,'
判断当前字符是否为'
JNZL2;
不是'
转移
JMPL4
L2:
MOVAL,[BX];
判断当前字符是否为正数
ROLAL,1
JNCL3;
是正数转移
JMPL1
L3:
RORAL,1;
恢复数据
MOV[SI],AL;
将数据存入目标地址
CMPDI,0
JGL5;
正数个数>
=2则开始排序
MOVAH,4CH
INT21H;
正数个数为0或1均跳出
L5:
LEASI,PLUS;
以下为使用冒泡排序的方法对数据排序
MOVCX,DI
CMPAL,[SI+1]
JNCL7
XCHGAL,[SI+1]
L7:
LOOPL6
DECDI
JNZL5
方法二
在数据存放的原地址将数据进行由小到大的冒泡排序,则每次那循环可得到本次排序中的最大数,将其存入目的地址,直到得到一个非正的数后跳出。
PLUSDB(?
LEASI,PLUS
MOVAL,[BX]
检查当前字符是否为'
JNZL2
JMPL3
INCDI
INCBX
LEABX,BUFFER;
开始排序
CMPAL,[BX+1]
JLEL5;
前小后大转移
XCHGAL,[BX+1]
MOV[BX],AL
INCBX
LOOPL4
得到本次循环的最大数
JNCAA4;
检验是否为正数,是则转移
MOV[SI],DL;
保存数据
DECDI
JNZL3;
进入下一次循环
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:
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个数据
MOVAL,[BX];
取一个数组元素
TESTAL,80H;
AL,80H按位与
JZL2;
结果为0,则AL为正,转L2
MOV[DI],AL;
AL为负,送负数数组N
BX+1,准备取M的下一个元素
INCDI;
负数数组N写位置后移一位
INCDH;
负数计数DH+1
JMPL3;
本次处理结束
MOV[SI],AL;
AL为正,送正数数组P
INCBX
INCSI;
正数数组P写位置后移一位
INCDL;
正数计数DL+1
LOOPL1;
跳转进入下一次循环
MOVCX,2;
二次输出循环,分别显示正负数的个数
MOVBL,DL;
保存DL,实质是暂时保存DL的低4位
SHRDL,1
SHRDL,1;
逻辑右移4位,即取高4位
CMPDL,10
JBL4;
DL<
10
ADDDL,7;
DL>
=10时,DL+7,9的ASCII码为39H,A的ASCII码为41H,相差8
ADDDL,30H
MOVAH,2;
输出DL,正/负数个数的高位
MOVDL,BL;
BL送DL,准备显示正/负数个数的低位
ANDDL,0FH;
DL高4位置0,因为DL的高4位已显示
ADDDL,30H
MOVDL,0AH;
换行
MOVDL,0DH;
回车
MOVDL,DH;
DH送DL,准备显示负数的个数
LOOPL5
10.试编写一源程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。
输入一个个位数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
LOOPAA1;
循环响铃
MOVAH,4CH
11.在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否有数字。
如有,则把CL置0FFH,否则将CL置0。
DATASSEGMENT
STRINGDB'
XYZIL12LWR'
;
'
内可以是任意字符串
NEQU$-STRING;
字符串长度
DATASENDS
CODESSEGMENT
CODES,DS:
DATAS
MOVAX,DATAS
MOVCX,N
MOVAL,[BX]
CMPAL,30H;
字符ASCII码小于30H,转移
JBAA2
CMPAL,39H;
字符ASCII码大于39H,转移
JMPAA3;
数字,符合条件
INCBX
LOOPAA1
MOVCL,0
JMPAA4
MOVCL,0FFH
MOVAH,4CH
CODESENDS
12.试编制一源程序,把DX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的4个字符中.例如,当DX=2A49H时,程序执行完后,MEM中的4个字节内容为39H、34H、41H、和32H。
SOURCEDW2A49H
MEMDB4DUP(?
MOVDX,SOURCE
LEABX,MEM
settheloop
MOVCX,4
theloopbody
LB:
MOVAX,DX
ANDAX,000FH
CMPAL,10
JCAD
ADDAL,7
AD:
ADDAL,30H
SHRDX,1
LO