汇编实例.docx
《汇编实例.docx》由会员分享,可在线阅读,更多相关《汇编实例.docx(23页珍藏版)》请在冰豆网上搜索。
汇编实例
例1:
要求将两个5字节16进制数相加。
程序如下:
DATASEGMENT
DATA1DB0F8H,60H,0ACH,74H,3BH
DATA2DB0C1H,36H,9EH,0D5H,20H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,5
MOVSI,0
CLC
LOOPER:
MOVAL,DATA2[SI]
ADCDATA1[SI],AL
INCSI
DECCX
JNZLOOPER
CODEENDS
ENDSTART
例2:
试编制一个程序把BX寄存器内的二进制数用十六进制数形式在屏幕上显示出来。
CODESEGMENT
ASSUMECS:
CODE
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVBX,12ABH
MOVCH,4
ROTATE:
MOVCL,4
ROLBX,CL
MOVAL,BL
ANDAL,OFH
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,7H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
DECCH
JNZROTATE
RET
CODEENDS
ENDSTART
例3:
在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。
DATASEGMENT
ADDRDWNUMBER
NUMBERDWY
COUNTDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,0
MOVBX,ADDR
MOVAX,[BX]
REPEAT:
TESTAX,0FFFFH
JZEXIT
JNSSHIFT
INCCX
SHIFT:
SHLAX,1
JMPREPEAT
EXIT:
MOVCOUNT,CX
RET
CODEENDS
ENDSTART
例4:
将正数N插入一个已整序的字数组的正确位置。
该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有数均为正数且已按递增的次序排列。
DATASEGMENT
ARRAY_HEADDW3,5,15,23,37,49,52,65,78,99
ARRAY_ENDDW105
NDW32
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAX,N
MOVARRAY_HEAD-2,0FFFFH
MOVSI,0
COMPARE:
CMPARRAY_END[SI],AX
JLEINSERT
MOVBX,ARRAY_END[SI]
MOVARRAY_END[SI+2],BX
SUBSI,2
JMPSHORTCOMPARE
INSERT:
MOVARRAY_END[SI+2],AX
RET
CODEENDS
ENDSTART
例5:
(逻辑尺示例)设有数组X和Y。
X数组中有X1,…X10;Y数组中有Y1,…Y10;试编制程序计算Z1=X1+Y1Z2=X2+Y2Z3=X3-Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8
Z9=X9+Y9Z10=X10+Y10。
DATASEGMENT
XDWX1,X2,X3,X4,X5,X6,X7,X8,X9,X10
YDWY1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,Y19
ZDWZ1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z19
LOGIC_RULEDW00DCH
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVBX,0
MOVCX,10
MOVDX,LOGIN_RULE
NEXT:
MOVAX,X[BX]
SHRDX,1
JCSUBTRACT
ADDAX,Y[BX]
JMPSHORTRESULT
SUBTRACT:
SUBAX,Y[BX]
RESULT:
MOVZ[BX],AX
ADDBX,2
LOOPNEXT
RET
CODEENDS
ENDSTART
例6:
编程实现:
比较两个字符串STR1和STR2所含字符是否相等,若相等则显示“MATCH”,若不相等则显示“NOMATCH”。
(两个字符串均在数据段给出)
DATASEGMENT
STR1DB'ABCDFE'
COUT1DB$-STR1
STR2DB'ABCDF'
COUT2DB$-STR2
FINDDB'MATCH',0DH,0AH,'$'
NOFINDDB'NOMATCH',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVBL,COUT1
CMPBL,COUT2
JNEDISPNO
LOOP1:
MOVCL,COUT1
MOVCH,0
LEASI,STR1
LEADI,STR2
REPECMPSB
JNEDISPNO
MOVAH,09H
LEADX,FIND
INT21H
JMPEXIT
DISPNO:
MOVAH,09
LEADX,NOFIND
INT21H
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
老师给的:
DATASEGMENT
STR1DB'ABCDF'
STR2DB'ABCDF'
FINDDB'MATCH',0DH,0AH,'$'
NOFINDDB'NOMATCH',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LOOP1:
LEASI,STR1
LEADI,STR2
MOVCX,STR2-STR1
CMPCX,FIND-STR2
JNZDISPNO
REPECMPSB
JNEDISPNO
LEADX,FIND
JMPEXIT
DISPNO:
LEADX,NOFIND
EXIT:
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
例7:
编程实现:
比较两个字符串STR1和STR2所含字符是否相等,若相等则显示“MATCH”,若不相等则显示“NOMATCH”。
(其中一个字符串在数据段给出,另一个用键盘输入,比较字符串是否相等)
DATASEGMENT
STR1DB21
DB?
DB21DUP(?
)
STR2DB'ABC'
COUNTEQU$-STR2
FINDDB'MATCH',0DH,0AH,'$'
NOFINDDB'NOMATCH',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVDX,OFFSETSTR1
MOVAH,0AH
INT21H
MOVCX,COUNT
CMPCL,STR1+1
JNEDISPNO
LEASI,STR1+2
LEADI,STR2
MOVCX,COUNT
REPECMPSB
JNEDISPNO
MOVAH,09H
LEADX,FIND
INT21H
JMPEXIT
DISPNO:
MOVAH,09
LEADX,NOFIND
INT21H
EXIT:
MOVAH,4CH
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例8:
编程实现:
比较两个字符串STR1和STR2所含字符是否相等,若相等则显示“MATCH”,若不相等则显示“NOMATCH”。
(两个数均用键盘输入,比较字符串是否相等)
老师给的:
DATASEGMENT
STR1DB20
DB?
DB20DUP(?
)
STR2DB20
DB?
DB20DUP(?
)
FINDDB'MATCH',0DH,0AH,'$'
NOFINDDB'NOMATCH',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVDX,OFFSETSTR1
MOVAH,0AH
INT21H
MOVDX,OFFSETSTR2
MOVAH,0AH
INT21H
MOVAL,STR1+1
CMPAL,STR2+1
JNEDISPNO
LEASI,STR1+2
LEADI,STR2+2
MOVCL,STR1+1
MOVCH,0
REPECMPSB
JNEDISPNO
MOVAH,09H
LEADX,FIND
INT21H
JMPEXIT
DISPNO:
MOVAH,09
LEADX,NOFIND
INT21H
EXIT:
MOVAH,4CH
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例9:
已知字数组A包含5个互不相等的整数,字数组B包含5个互不相等的整数,编程实现:
把既在A中又在B中出现的整数存放到字数组C中。
DATASEGMENT
ADW2,6,8,9,3
BDW5,8,3,9,7
CDW5DUP(0)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
MOVBX,0
MOVCX,5
LOOP1:
PUSHCX
MOVDI,0
MOVCX,5
MOVAX,A[SI]
LOOP2:
CMPB[DI],AX
JNENO
MOVC[BX],AX
ADDBX,2
NO:
ADDDI,2
LOOPLOOP2
ADDSI,2
POPCX
LOOPLOOP1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例10:
编程实现:
若两个指定的字节变量相等则调用ALLSAME子程序,显示“Y”,否则调用“NOTSAME”子程序,显示“N”。
DATASEGMENT
VAR1DB1
VAR2DB2
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMEDS:
DATA,CS:
CODE
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAL,VAR1
CMPAL,VAR2
JESAME
CALLNOTSAME
JMPEXITCMP
SAME:
CALLALLSAME
EXITCMP:
RET
MAINENDP
ALLSAMEPROCNEAR
MOVDL,'Y'
MOVAH,2
INT21H
RET
ALLSAMEENDP
NOTSAMEPROCNEAR
MOVDL,'N'
MOVAH,2
INT21H
RET
NOTSAMEENDP
RET
CODEENDS
ENDSTART
例11:
编程:
在显示器上显示HELLO字符串。
DATASEGMENT
BUFDB'HELLO','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETBUF
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例12:
编程:
从键盘输入一字符串(最多20个字符)到数据段中以CHAR为首地址的区域。
DATASEGMENT
CHARDB21
DB?
DB21DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETCHAR
MOVAH,0AH
INT21H
RET
CODEENDS
ENDSTART
例13:
编程实现:
将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。
(不要求有输出,用debug查看结果)
DATASEGMENT
XDW1234H
MEMDB4DUP(?
)
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCL,4
MOVCH,4
LEABX,MEM
MOVAX,X
A1:
MOVDX,AX
ANDDX,0FH
MOVBYTEPTR[BX],DL
INCBX
SHRAX,CL
DECCH
JNZA1
B1:
MOVDL,MEM
MOVCL,MEM+1
MOVBL,MEM+2
MOVAL,MEM+3
RET
CODEENDS
ENDSTART
例14:
运用子程序,键盘上输入一个十进制数,用十六进制显示出来,
DECIHEXSEGMENT
ASSUMECS:
DECIHEX
MAINPROCFAR
REPEAT:
CALLDECIBIN
CALLCRLF
CALLBINIHEX
CALLCRLF
JMPREPEAT
MAINENDP
DECIBINPROCNEAR
MOVBX,0
NEWCHAR:
MOVAH,1
INT21H
SUBAL,30H
JLEXIT
CMPAL,9D
JGEXIT
CBW
XCHGAX,BX
MOVCX,10D
MULCX
XCHGAX,BX
ADDBX,AX
JMPNEWCHAR
EXIT:
RET
DECIBINENDP
BINIHEXPROCNEAR
MOVCH,4
ROTATE:
MOVCL,4
ROLBX,CL
MOVAL,BL
ANDAL,0FH
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,7H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
DECCH
JNZROTATE
RET
BINIHEXENDP
CRLFPROCNEAR
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
RET
CRLFENDP
DECIHEXENDS
ENDMAIN
例15:
8251初始化CPU发送十个字节
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
ORG100H
START:
JMPINIT
BUFFDB'0123456789'
INIT:
MOVDX,362H
MOVAL,0
MOVDX,AL
MOVDX,AL
MOVDX,AL
MOVAL,40H
MOVDX,AL
MOVAL,0FEH
OUTDX,AL
MOVAL,01H
OUTDX,AL
MOVSI,OFFSETBUFF
MOVCX,10
YYY1:
MOVDX,362H
INAL,DX
TESTAL,01H
JEYYY1
MOVAL,[SI]
MOVDX,360H
OUTDX,AL
INCSI
LOOPYYY1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例16:
在以STR为首地址的缓冲区中,有一组字符串,该字符串以“$”为结束符,编程统计该字符串的长度,结果存入RUS变量中。
DATASEGMENT
STRDB'ABCDE$'
RUSDW?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVSI,0
MOVCX,0
NEXT:
MOVBL,STR[SI]
CMPBL,'$'
JEEXIT
INCCX
INCSI
JMPNEXT
EXIT:
MOVRUS,CX
RET
CODEENDS
ENDSTART
例17:
编程实现:
从键盘输入一系列以$为结束符的字符串,然后统计其中的非数字字符数。
DATASEGMENT
BUFDB50DUP(?
)
COUNTDB0
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
LEABX,BUF
INPUT:
MOVAH,1
INT21H
MOV[BX],AL
INCBX
CMPAL,'$'
JNZINPUT
LEABX,BUF
NEXT:
MOVCL,[BX]
INCBX
CMPCL,'$'
JZDISP
CMPCL,30H
JBCONT
CMPCL,39H
JBENEXT
CONT:
INCCOUNT
JMPNEXT
DISP:
MOVAL,COUNT
MOVAH,0
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例18:
在DAT字节单元中有一个带符号数,判断其正负,若为正数,则屏幕显示“+”,若为负数,则屏幕显示“-”,若为0,则屏幕显示“0”。
老师的方法:
DATASEGMENT
DATDB10
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVAH,2
CMPDAT,0
JGEDY
MOVDL,'-'
INT21H
JMPEXIT
DY:
JEEEQ
几点注意事项:
一、2号中断的前两句无先后顺序且3句话可分开写,不一定要写在一起。
二、标号不具有跳转能力。
三、程序中的地址是逻辑地址而非实际地址。
故有数据段的时候,装入DS的方式必须有,这是找段基址要求的,否则程序在编译时有偏移量,找不到段基址出现错误。
四、程序是顺序执行的。
MOVDL,'+'
INT21H
JMPEXIT
EEQ:
MOVDL,'0'
INT21H
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
例19:
ADDR中有Y的地址,在Y中统计“1”的个数放入COUNT中
DATASEGMENT
ADDRDWNUMBER
NUMBERDW123111
COUNTDW?
DATAENDS
CODESEGMRNT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,0
MOVBX,ADDR//Y的地址给AX
MOVAX,[BX]
REPEAT:
TESTAX,0FFFFH
JZEXIT
JNSSHIFT
INCCX
SHIFT:
SHLAX,1
JMPREPEAT
EXIT:
MOVCOUNT,CX
RET
CODEENDS
ENDSTART
符号函数:
>0输出+<0输出-求极值统计个数芯片上8255信号灯8253通道0计数100次