汇编经典代码.docx
《汇编经典代码.docx》由会员分享,可在线阅读,更多相关《汇编经典代码.docx(19页珍藏版)》请在冰豆网上搜索。
汇编经典代码
1.顺序程序设计
将两个多位十进制数相加,要求被加数、加数均以ASCⅡ码形式各自顺序存放在以DATA1和DATA2为首的五个内存单元中(低位在前),结果送回DATA1处。
DATASEGMENT
DATA1DB34H,35H,39H,38H,36H,'';被加数
DATA2DB37H,34H,33H,36H,32H,'';加数
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,DATA1;有效地址送SI,为调用显示子程序做准备
CALLDISPLAY;调用显示子程序
CALLCRLF;调用回车换行子程序
LEASI,DATA2;有效地址送SI,为调用显示子程序做准备,同时为加法运算做准备
CALLDISPLAY;调用显示子程序
CALLCRLF;调用回车换行子程序
LEADI,DATA1;有效抵制送DI,为加法运算做准备
MOVAX,0
MOVBX,0
MOVCL,05H;记录循环次数
ADDS:
MOVAL,[SI];将加数送往AL
SUBAL,30H
ADDAL,BL;加上进位
MOVBL,[DI];将被加数送往BL
SUBBL,30H
ADDAL,BL;加法运算
ADDAL,30H
CMPAL,3AH
JASUBA;结果>=10,跳到SUBA
JBNSUBA
SUBA:
SUBAL,0AH;减去10的值,并置BL为1MOVBL,01H
JMPCONTINUE
NSUBA:
MOVBL,00H;置BL为0
CONTINUE:
MOV[DI],AL;将相加的结果从AL送往DI的地址,即DATA1的地址
INCDI;地址加1
INCSI;地址加1
LOOPADDS;循环
JCSHUCHU
JNCSHUCHU2
SHUCHU2:
MOVAL,31H;CF为1设置结果最高位为1JMPCONTINUE2
SHUCHU:
MOVAL,30H;CF为0设置结果最高位为0
CONTINUE2:
MOV[DI],AL
LEASI,DATA1;将DATA1的有效地址送往SI,为调用DISPLAY子程序做准备CALLDISPLAY;调用DISPLAY子程序MOVAX,4C00H;返回DOSINT21H
MAINENDP
CRLFPROCNEAR;回车、换行于功能MOVDL,0DH
MOVAH,02HINT21HMOVDL,0AH
MOVAH,02HINT21H
RET
CRLFENDP
DISPLAYPROCNEAR;显示于功能
MOVBX,0006H;记录循环次数
DSL:
MOVDL,[SI+BX-1];将有效地址内的内容送往DL
MOVAH,02;2号功能输出
INT21H
DECBX;BX自动减1
JNZDSL
RET
DISPLAYENDP
CODEENDS
ENDSTART
2分支程序设计实验
接收键盘输入字符,将其中的小写字母转换为大写字母并显示。
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE
START:
MOVAH,00H
INT16H
CMPAL,0DH
JZOVER
CALLJUDGE
MOVDL,AL
MOVAH,02H
INT21H
JMPSTART
OVER:
MOVAH,4CH
INT21H
MAINENDP
JUDGEPROCNEAR
CMPAL,'a'
JBSTOP
CMPAL,'z'
JASTOP
SUBAL,20H
STOP:
RET
JUDGEENDP
CODEENDS
ENDSTART
3循环程序设计实验
统计一个有10人的班中,男、女生的人数各为多少。
将男生人数存入变量MAN、女生人数存入变量WOMAN中。
DATASEGMENT
MANDB0,0
WOMANDB0,0
STRINGDB'iuputpeoplenumber!
(manis0,womanis1)$'
SMDB'manis:
$'
SWDB'womanis:
$'
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,09H;将STRING的内容输出
MOVDX,OFFSETSTRING
INT21H
CALLCRLF
MOVCX,10;男女生总人数
AA:
MOVAH,01H;从键盘输入,0为男,1为女
INT21H
CMPAL,30H;与'0'比较
JNZADDW;不为'0',女生人数加1
INCMAN;否则男生人数加1
BB:
LOOPAA
JMPDISPLY;打印
ADDW:
INCWOMAN
JMPBB
DISPLY:
CALLCRLF
MOVAH,09H;字符串输出
MOVDX,OFFSETSM
INT21H
MOVAH,02H;男生人数统计结果输出
MOVDL,MAN
ADDDL,30H
CALLJUDGE
CALLCRLF
MOVAH,09H;字符串输出
MOVDX,OFFSETSW
INT21H
MOVAH,02H;女生人数统计结果输出
MOVDL,WOMAN
ADDDL,30H
CALLJUDGE
MOVAH,4CH;返回DOS
INT21H
MAINENDP
JUDGEPROCNEAR;判断结果是否为39H
CMPDL,3AH
JZSHI
CC:
INT21H
RET
SHI:
MOVDL,31H
INT21H
MOVDL,30H
JMPCC
JUDGEENDP
CRLFPROCNEAR;回车换行子程序
MOVAH,02H;回车
MOVDL,0DH
INT21H
MOVDL,0AH;换行
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART
4子程序设计实验
1.键盘输入字符,依次显示在行的最左端(即每接受一个字符,显示在屏幕上并回车换行。
)
2.对频繁使用的回车换行编写为子程序,在主程序中调用完成分行显示。
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE
START:
MOVCX,10;设置循环次数
NEXT:
MOVAH,01H;从键盘输入一个字符
INT21H
CALLCRLF;调用回车换行子程序
LOOPNEXT
MOVAH,4CH;返回DOS
INT21H
MAINENDP
CRLFPROCNEAR;回车换行子程序
MOVAH,02H;回车
MOVDL,0DH
INT21H
MOVDL,0AH;换行
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART
5码制转换程序实验
将ASCⅡ码数据转换成二进制数据。
要求从键盘上输入十进制整数(假定范围0~32767),然后转换成二进制格式存储。
DATASEGMENT
STRING1DB'PLEASEINPUTANUMBER(0~32767):
$'
STRING2DB'THEASCIIIS:
$'
STRING3DB'THEBINARYIS:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H
CALLCRLF
INPUT:
MOVAH,01H;输入数据
INT21H
CMPAL,0DH
JZNEXT
SUBAL,30H
JLINPUT
CMPAL,39H
JGINPUT
CBW
XCHGAX,BX;AX为输入值,BX保存结果,两个对调为MUL做准备
MOVDX,10D;将上一次结果乘10
MULDX
XCHGAX,BX;AX为本次输入的值,BX为之前的结果
ADDBX,AX
JMPINPUT
NEXT:
CALLCRLF
MOVCL,4D
MOVCH,4D
MOVDX,OFFSETSTRING2
MOVAH,09H
INT21H
CALLCRLF
LOOP0:
ROLBX,CL;循环左移,将最高为存到BL的低四位
MOVAL,BL
ANDAL,0FH;
ADDAL,30H
CMPAL,3AH
JLOUTPUT
ADDAL,07H
OUTPUT:
MOVAH,02H
MOVDL,AL
INT21H
DECCH
JNZLOOP0
CALLCRLF
MOVDX,OFFSETSTRING3
MOVAH,09H
INT21H
CALLCRLF
MOVCH,16D
MOVCL,1D
LOOP1:
ROLBX,CL
MOVAL,BL
ANDAL,01H
ADDAL,30H
MOVAH,02H
MOVDL,AL
INT21H
DECCH
JNZLOOP1
MOVAH,4CH
INT21H
MAINENDP
OUTSPROCNEAR;字符串输出子程序
MOVAH,09H
INT21H
RET
OUTSENDP
CRLFPROCNEAR;回车换行子程序
MOVAH,02H;回车
INT21H
MOVDL,0AH;换行
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART
6两个数相乘的实验
实现十进制数的乘法,被乘数和乘数均以ASCⅡ码形式放在内存中,乘积在屏幕上显示出来。
DATASEGMENT
MBCSDW0
MCSDW0
RESULTDW0
STRING1DB'THEBEICHENGSHUIS:
$'
STRING2DB'THECHENGSHUIS:
$'
STRING3DB'THERESULTIS:
$'
STRINGDB'THEASCIIIS:
$'
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1
CALLOUTS
CALLINPUT;输入被乘数
MOVDX,OFFSETSTRING
CALLOUTS
CALLCRLF
CALLASCII;被乘数转化为ASCII码输出
CALLCRLF
MOVMBCS,BX;被乘数保存到MBCS中
MOVDX,OFFSETSTRING2
CALLOUTS
CALLINPUT;输入乘数
MOVDX,OFFSETSTRING
CALLOUTS
CALLCRLF
CALLASCII;乘数转化为ASCII码输出
CALLCRLF
MOVMCS,BX;乘数保存到MCS中
MOVDX,OFFSETSTRING3
CALLOUTS
CALLCRLF
MOVAX,MBCS;被乘数
MULBX;乘数与被乘数相乘,结果高位DX,低位AX
MOVRESULT,AX;将AX中的内容保存到RESULT中
MOVBX,DX;将高位DX的值送给BX输出
CALLASCII
MOVBX,RESULT;将低位AX的值送给BX输出
CALLASCII
MOVAH,4CH
INT21H
MAINENDP
INPUTPROCNEAR;输入十进制数,将其转化为ASCII码存到BX中
CALLCRLF
MOVBX,0
AA:
MOVAH,01H
INT21H
CMPAL,0DH
JZSTOP
SUBAL,30H
JLAA
CMPAL,39H
JGAA
CBW
XCHGAX,BX;AX为输入值,BX保存结果,两个对调为MUL做准备
MOVDX,10D;将上一次结果乘10
MULDX
XCHGAX,BX;AX为本次输入的值,BX为之前的结果
ADDBX,AX
JMPAA
STOP:
CALLCRLF
RET
INPUTENDP
ASCIIPROCNEAR
MOVCL,4D
MOVCH,4D
CC:
ROLBX,CL;循环左移,将最高为存到BL的低四位
MOVAL,BL
ANDAL,0FH;
ADDAL,30H
CMPAL,3AH
JLBB
ADDAL,07H
BB:
MOVAH,02H
MOVDL,AL
INT21H
DECCH
JNZCC
RET
ASCIIENDP
OUTSPROCNEAR
MOVAH,09H
INT21H
RET
OUTSENDP
CRLFPROCNEAR;回车换行子程序
MOVAH,02H;回车
MOVDL,0DH
INT21H
MOVDL,0AH;换行
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART
7从键盘输入数据并显示的程序
编写程序将键盘接收到的四位十六进制数据转换为等值的二进制数,再显示在终端上。
DATASEGMENT
STRING1DB'Pleaseenterafour-digithexadecimalnumber:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H
CALLCRLF
MOVCL,4D
INPUT:
MOVAH,01H
INT21H
CMPAL,'0'
JBINPUT
CMPAL,'9'
JAZIMU
SUBAL,30H
JMPNEXT
ZIMU:
CMPAL,'A'
JBINPUT
CMPAL,'Z'
JAINPUT
SUBAL,37H
NEXT:
CBW
XCHGAX,BX
MOVDX,16D
MULDX
XCHGAX,BX
ADDBX,AX
LOOPINPUT
CALLCRLF
MOVCL,1D
MOVCH,16D
TO:
ROLBX,1
MOVDL,BL
ANDDL,01H
ADDDL,30H
MOVAH,02H
INT21H
DECCH
JNZTO
MOVAH,4CH
INT21H
MAINENDP
CRLFPROCNEAR;回车换行子程序
MOVAH,02H;回车
MOVDL,0DH
INT21H
MOVDL,0AH;换行
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART
8字符和数据的显示程序
先显示信息“INPUTSTRINGTHEENDFLAGIS$”再接受字符如为0~9则计数器加1并显示数据。
如为非数字,则直接显示但不计数。
DATASEGMENT
STRING1DB'INPUTSTRINGTHEENDFLAGIS$'
COUNTDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H
CALLCRLF
INPUT:
MOVAH,0
INT16H
CMPAL,0DH
JZSTOP
CMPAL,'0'
JBTO
CMPAL,'9'
JATO
INCCOUNT
TO:
MOVAH,02H
MOVDL,AL
INT21H
JMPINPUT
STOP:
CALLCRLF
MOVAH,02H
MOVDL,COUNT
ADDDL,30H
INT21H
MOVAH,4CH
INT21H
MAINENDP
CRLFPROCNEAR;回车换行子程序
MOVAH,02H;回车
MOVDL,0DH
INT21H
MOVDL,0AH;换行
INT21H
RET
CRLFENDP
CODEENDS
ENDSTART