汇编例子 新.docx

上传人:b****1 文档编号:2645569 上传时间:2023-05-04 格式:DOCX 页数:37 大小:22.63KB
下载 相关 举报
汇编例子 新.docx_第1页
第1页 / 共37页
汇编例子 新.docx_第2页
第2页 / 共37页
汇编例子 新.docx_第3页
第3页 / 共37页
汇编例子 新.docx_第4页
第4页 / 共37页
汇编例子 新.docx_第5页
第5页 / 共37页
汇编例子 新.docx_第6页
第6页 / 共37页
汇编例子 新.docx_第7页
第7页 / 共37页
汇编例子 新.docx_第8页
第8页 / 共37页
汇编例子 新.docx_第9页
第9页 / 共37页
汇编例子 新.docx_第10页
第10页 / 共37页
汇编例子 新.docx_第11页
第11页 / 共37页
汇编例子 新.docx_第12页
第12页 / 共37页
汇编例子 新.docx_第13页
第13页 / 共37页
汇编例子 新.docx_第14页
第14页 / 共37页
汇编例子 新.docx_第15页
第15页 / 共37页
汇编例子 新.docx_第16页
第16页 / 共37页
汇编例子 新.docx_第17页
第17页 / 共37页
汇编例子 新.docx_第18页
第18页 / 共37页
汇编例子 新.docx_第19页
第19页 / 共37页
汇编例子 新.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编例子 新.docx

《汇编例子 新.docx》由会员分享,可在线阅读,更多相关《汇编例子 新.docx(37页珍藏版)》请在冰点文库上搜索。

汇编例子 新.docx

汇编例子新

汇编实例:

必须懂的题目:

1、X,Y,W为字节类型的数,求Z=((W-X)*10+5)/(X+Y)

DSegSegment

xdb38h

ydb20h

wdb30h

zdw?

tendb10

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movbl,x

addbl,y;先求分母,存于BL

moval,w

subal,x

imulten

addax,5

idivbl

movz,ax

moval,0

movah,4ch

int21h

CSegends

endStart

2、X,Y为字节类型数,求((X+Y)*8-(X-Y)*2)/16

写出完整的数据段和代码段,不用乘除指令

DSegSegment

xdb38h

ydb20h

zdb?

DSegends

CSegSegment

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

moval,x

addal,y

cbw

movcl,3

salax,cl;(x+y)*8

Movbx,ax

moval,x

subal,y

cbw

Salax,1;(x-y)*2

subbx,ax

movcl,4

sarax,cl;((x+y)*8-(x-y)*2)/16

movz,al

moval,0

movah,4ch

int21h

CSegends

endStart

1、统计字符串中空格的个数和字符串长度,字符串以’$’结束

DSegSegment

Bufdb'FDSHHFOEHWHLK$'

cundb0

lendb0

DSegends

CSegSegment

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

moval,0;存放空格个数

leabx,buf

movah,0;存放字符串长度

again:

cmpbytrptr[bx],'$'

jeexit

cmpbyteptr[bx],20h;内存单元与立即数比较时要说明类型,这一句也可以成(movdl,[bx]cmpdl,20h)20H是空格的ASC码

jness

incal

ss:

incah

incbx

jmpagain

exit:

movlenah

movcon,al

moval,0

movah,4ch

int21h

CSegends

endStart

2、Y=∑Ai*Bi,i=1—8,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中,

DSegSegment

num1db12,34,56,78,65,02,39,8

num2db98,65,32,74,78,12,03,56

resultdw?

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movcx,8

movbx,0

movsi,offsetnum1

movdi,offsetnum2

again:

moval,[si]

mulbyteptr[di]

addbx,ax

incdi

incsi

loopagain

movresult,bx

moval,0

movah,4ch

int21h

CSegends

endStart

 

已知数组A中包含4个互不相等的整数,数组B中包含7个互不相等的整数,编程把既在A中又在B中出现的整数存于数组C中

DSegSegment

adb23,67,2,1

bdb23,35,67,5,6,7,9

cdb4dup(?

DSegends

 

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movsi,0;SI为A数组的变址寄存器

movbx,0;BX为C数组的变址寄存器

l:

movcx,7;CX中存放B数组的个数,与LOOP配合控制循环次数

moval,a[si];取A数组中的数存AL

movdi,0;DI为B数组的变址寄存器,

下一个A数组中的数与B数组的数比较时要把DI清0

l1:

cmpal,b[di]

jnenext

movc[bx],al

incbx

next:

incdi;在循环结束前回到L1,取B数组的下一个数

loopl1

incsi;在外循环结束前回到L,取A数组的下一个数

cmpsi,4;4为A数组的个数

jbl;控制外循环结束

moval,0

movah,4ch

int21h

CSegends

endStart

 

显示

*********

*******

*****

***

*

DSegSegment

Msgdb0dh,0ah,'$'

DSegends

CSegSegment

Assumecs:

CSeg,ds:

DSeg

start:

movax,dseg

movds,ax

movbx,9;第一行的字符个数

lp:

movcx,bx;字符个数送cx,为循环次数

lop:

movdl,'*';以下3句为显示字符*

movah,2

int21h

looplop

leadx,msg;以下3句回车换行

movah,09h

int21h

decbx

decbx

cmpbx,1;BX-2,判断,如果<=1则回到LP,显示下一行

jgelp;注意,要用JGE,不能用JAE

moval,0

movah,4ch

int21h

CSegends

endStart

 

1、编写程序,统计字缓冲区中的20个数据的正数、负数、0的di,0;DI为B数组的变址寄存器,个数,并将统计结果以16进制形式显示出来。

(也可以写得简略一些,不显示程序中的字符串也可以)

DATASEGMENT

BUFDW0,-1,2,4,3,-4,5,6,-7,-6,9,-10,11,14,17,18,-16,-15,8,-13,20,22,-23,0,21

a1db0;存放正数个数

a2db0;存放负数个数

a3db0;0的个数

STR1DB'THENUMBEROFplusIS:

','$'

STR2DB'THENUMBEROFminusIS:

','$'

STR3DB'THENUMBEROFzeroIS:

','$'

STR4DB0DH,0AH,'$'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

LEASI,BUF

MOVCX,25

LOP:

CMPwordPTR[SI],0

jgel1;>=0转l1

INCa2;负数

JMPL3

L1:

jel2;=0转L2

INCa1;正数

JMPL3

L2:

INCa3;零

L3:

ADDSI,2

LOOPLOP

LEADX,STR1;显示正数的字符串

MOVAH,09H

INT21H

movbh,0

movbl,a1

CALLDISP;通过调用显示子程序显示正数的个数,子程序中的要显示的数字存于bx中

LEADX,STR4;回车换行

MOVAH,09H

INT21H

LEADX,STR2

MOVAH,09H

INT21H

movbl,a2

CALLDISP

LEADX,STR4;回车换行

MOVAH,09H

INT21H

LEADX,STR3

MOVAH,09H

INT21H

movbl,a3

CALLDISP

MOVAH,4CH

INT21H

DISPPROC;显示BX中的数

movch,4

roll:

movcl,4

rolbx,cl

movdl,bl

anddl,0fh

cmpdl,9

jbenext1

adddl,07h

next1:

adddl,30h

movah,02h

int21h

decch

jnzroll

RET

DISPENDP

CODEENDS

ENDSTART

2、编写子程序搜索指定字符缓冲区中是否有n,如果有用y替代。

调用子程序将BUF1,BUF2,BUF3中的n全部用y替代

datasegment

buf1db'Iamastudent!

','$'

len1=$-buf1

buf2db'ewfhefnfn','$'

len2=$-buf2

buf3db'hdinky','$'

len3=$-buf3

mdb13,10,'$'

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

leasi,buf1

movcx,len1

callcmmp

leasi,buf2

movcx,len2

callcmmp

leasi,buf3

movcx,len3

callcmmp

movah,4ch

int21h

;子程序的功能:

搜索字符串中是否有n字符,如果有用y替代,并显示字符串

;入口参数为字符串偏移地址SI,字符串长度CX

cmmpproc

movdx,si;将要显示的字符串的偏移地址送DX,用于显示字符串。

这句应在子程序的开始,因为下面语句会改变SI的值

l1:

cmpbyteptr[si],'n'

jnzl2

moval,'y'

mov[si],al

l2:

incsi

loopl1

movah,09h;显示字符串

int21h

leadx,m;回车换行

int21h

ret

cmmpendp

codeends

endstart

在buf开始的存储单元中查找字符'E',找到后删除E后面的2个字符,并显示字符串。

DATASEGMENT

COUNDB20

BUFDB'ABCDEFGHIJKLMNOPQRST'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,ES:

DATA;

START:

MOVAX,DATA

MOVDS,AX

MOVES,AX

LEADI,BUF

MOVCL,COUN

;查找字符E

MOVAL,'E'

CLD

REPNESCASB

JZFOUND

JMPDONE

;找到E后,DI指向E后面的第一个字符,将SI指向E后面的的3个字符,进行字符串传送

FOUND:

MOVSI,DI;

ADDSI,2;

SUBCL,2;

CLD

REPMOVSB

;显示字符串

MOVBYTEPTR[BUF+18],'$';

DONE:

LEASI,BUF

MOVDX,SI

MOVAH,9

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

 

;将数据段中的数字改成*

STACKSSEGMENTSTACK

DW128DUP(?

STACKSENDS

DSegSegment

stringdb'di2h4nl5jhl'

countequ$-string

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movcx,count;设置循环次数

movsi,offsetstring

again:

moval,[si]

cmpal,'0'

jbnext

cmpal,'9'

janext

moval,'*'

mov[si],al

next:

incsi

loopagain;字符个数减1,不为0继续循环

Done:

moval,0

movah,4ch

int21h

CSegends

endStart

 

;从键盘输入一个字符串,并把它显示出来

STACKSSEGMENTSTACK

DW128DUP(?

STACKSENDS

DSegSegment

cfdb0dh,0ah,'$'

msgdb20,?

20dup(?

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

leadx,msg

movah,0ah

int21h;系统等待键盘输入字符串

leadx,cf

movah,09h

int21h

Movbl,m送到bx寄存器

Movbh,0

movmsg+2[bx],'$';[msg+2+bx]单元是字符串的结尾,显示的字符串要以$结束,在字符串的结束处加$

leadx,msg+2

movah,09h

int21h

moval,0

movah,4ch

int21h

CSegends

endStart

 

显示十六进制数的子程序

DISPPROC;显示BX中的数

movch,4

roll:

movcl,4

rolbx,cl

movdl,bl

anddl,0fh

cmpdl,9

jbenext1

adddl,07h

next1:

adddl,30h

movah,02h

int21h

decch

jnzroll

RET

DISPENDP

;内存首地址为BUF的10个字节数,累加求和,结果存于RESULT中

STACKSSEGMENTSTACK

DW128DUP(?

STACKSENDS

DSegSegment

Bufdb3,4,56,7,8,-3,7,3,6,9

Resdb?

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

moval,0

leabx,buf

movcx,10

aga:

addal,[bx]

incbx

loopaga

movres,al

moval,0

movah,4ch

int21h

CSegends

sg+1;字符串长度放在msg+1,endStart

;程序段也可以写成

moval,0

mov?

?

?

?

?

?

bx,?

0

?

?

?

?

mov?

?

?

?

?

?

cx,?

10

aga:

?

add?

?

?

al,?

buf[bx]

?

?

?

inc?

?

?

?

?

?

?

bx

?

?

?

?

loop?

?

?

?

?

again

movres,al

 

;内存首地址为BUF的10个字节数,求0的个数,并显示出来。

STACKSSEGMENTSTACK

DW128DUP(?

STACKSENDS

DSegSegment

BUFDB0,-1,2,4,3,-4,5,6,-7,0

RESULTdb0

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

MOVAL,0;存放0的个数

LEASI,BUF

MOVCX,10

LOP:

CMPBYTEPTR[SI],0

JNEL3

INCAL;0的个数

L3:

INCSI

LOOPLOP

MOVBL,AL

MOVBH,0

CALLDISP;调用显示子程序

moval,0

movah,4ch

int21h

DISPPROC;显示BX中的数

movch,4

roll:

movcl,4

rolbx,cl

movdl,bl

anddl,0fh

cmpdl,9

jbenext1

adddl,07h

next1:

adddl,30h

movah,02h

int21h

decch

jnzroll

RET

DISPENDP

CSegends

endStart

 

;有数据段

STACKSSEGMENTSTACK

DW128DUP(?

STACKSENDS

DSegSegment

bufdw12,34,-45,-567,35,-54,23,-56,-432,-78,-678,43,76,321,761,-890,670,125,987,912

buf1dw20dup(?

buf2dw20dup(?

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movcx,20

leabx,buf

leasi,buf1

leadi,buf2

again:

movax,[bx]

cmpax,0

jll

mov[si],ax

incsi

incsi

jmpnext

l:

mov[Di],ax

incdi

incdi

next:

incbx

incbx

loopagain

 

moval,0

movah,4ch

int21h

CSegends

endStart

 

;将一个字符串中的所有大写字母改为小写字母,字符串以0结尾。

STACKSSEGMENTSTACK

DW128DUP(?

STACKSENDS

DSegSegment

Stringdb'AHLGLKNDLJ',0

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movbx,offsetstring

again:

moval,[bx];取一个字符

oral,al;是否为结尾符0

jzdone;是,退出循环

cmpal,'A';是否为大写A~Z

jbnext

cmpal,'Z'

janext

oral,20h;是,转换为小写字母

mov[bx],al;仍保存在原位置

next:

incbx

jmpagain;继续循环

done:

moval,0

movah,4ch

int21h

CSegends

endStart

 

;Y=∑Ai*Bi,i=1—8,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。

请同学们用另一种方法做,并把结果显示在屏幕上

DSegSegment

num1db12,34,56,78,65,02,39,8

num2db98,65,32,74,78,12,03,56

resultdw?

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

movcx,8

movbx,0

movsi,offsetnum1

movdi,offsetnum2

again:

moval,[si]

mulbyteptr[di]

addbx,ax

incdi

incsi

loopagain

movresult,bx

moval,0

movah,4ch

int21h

CSegends

endStart

 

;在首地址为MSG1的字数组中存放了10个16进制数,求出平均数,以及大于平均数的数个数,存放在count单元中.

DSegSegment

Msg1dw300H,300H,300H,300H,300H,100H,100H,100H,100H,100H

lendw10

Msg2dw?

;存放平均数

countdb0;大于平均数的数的个数

DSegends

CSegSegmentparapublic'CODE'

Assumecs:

CSeg,ds:

DSeg

Start:

movax,DSeg

movds,ax

;求和

leasi,msg1

movax,[si]

movcx,9

pp:

addsi,2

addax,[si]

looppp

;求平均数

movdx,0

idivlen

movmsg2,ax

;求大于平均数的个数

movcx,len

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2