汇编实例.docx

上传人:b****6 文档编号:8832185 上传时间:2023-02-02 格式:DOCX 页数:23 大小:19.78KB
下载 相关 举报
汇编实例.docx_第1页
第1页 / 共23页
汇编实例.docx_第2页
第2页 / 共23页
汇编实例.docx_第3页
第3页 / 共23页
汇编实例.docx_第4页
第4页 / 共23页
汇编实例.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

汇编实例.docx

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

汇编实例.docx

汇编实例

例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次

 

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

当前位置:首页 > 高等教育 > 农学

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

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