汇编语言小程序例子.docx

上传人:b****7 文档编号:10410830 上传时间:2023-02-11 格式:DOCX 页数:25 大小:21.07KB
下载 相关 举报
汇编语言小程序例子.docx_第1页
第1页 / 共25页
汇编语言小程序例子.docx_第2页
第2页 / 共25页
汇编语言小程序例子.docx_第3页
第3页 / 共25页
汇编语言小程序例子.docx_第4页
第4页 / 共25页
汇编语言小程序例子.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

汇编语言小程序例子.docx

《汇编语言小程序例子.docx》由会员分享,可在线阅读,更多相关《汇编语言小程序例子.docx(25页珍藏版)》请在冰豆网上搜索。

汇编语言小程序例子.docx

汇编语言小程序例子

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,returntodo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1