编写程序.docx

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

编写程序.docx

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

编写程序.docx

编写程序

试编写一程序求出双字长数的绝对值。

双字长数在A和A+2单元中,结果存放在B和B+2单元中。

答:

程序段如下:

MOVAX,A

MOVDX,A+2

CMPDX,0

JNSZHENSHU;不是负数则转走

NEGDX

NEGAX

SBBDX,0

ZHENSHU:

MOVB,AX

MOVB+2,DX

INT20H

编写程序段,把字符串STRING中的‘&’字符用空格符代替。

STRINGDB‘ThedateisFEB&03’

答:

程序段如下:

MOVCX,18

MOVAL,‘&’

CLD

MOVDI,SEGSTRING

MOVES,DI;ES段基地址

LEADI,STRING

REPNESCASB;不相等重复

JNENEXT;相等跳转

DECDI

MOVES:

BYTEPTR[DI],‘’;送空格符

NEXT:

假设数据段中数据定义如下:

STUDENT_NAMEDB30DUP()

STUDENT_ADDRDB9DUP()

PRINT_LINEDB132DUP()

分别编写下列程序段:

(1)用空格符清除PRINT_LINE域。

(2)在STUDENT_ADDR中查找第一个‘-’。

(3)在STUDENT_ADDR中查找最后一个‘-’。

(4)如果STUDENT_NAME域中全是空格符时,填入‘*’。

(5)把STUDENT_NAME移到PRINT_LINE的前30个字节中,把STUDENT_ADDR移到PRINT_LINE的后9个字节中。

答:

公共的程序段如下:

MOVDI,DS

MOVES,DI

(1)MOVCX,132

MOVAL.,‘’;空格的ASCII码送AL寄存器

CLD

LEADI,PRINT_LINE

REPSTOSB

(2)MOVCX,9

MOVAL.,‘-’

CLD

LEADI,STUDENT_ADDR

REPNESCASB

JNENO_DASH

DECDI

NO_DASH:

(3)MOVCX,9

MOVAL.,‘-’

STD

LEADI,STUDENT_ADDR

ADDDI,9-1

REPNESCASB

JNENO_DASH

INCDI

NO_DASH:

(4)MOVCX,30

MOVAL,‘’;空格的ASCII码送AL寄存器

CLD

LEADI,STUDENT_NAME

REPESCASB

JNENEXT

MOVCX,30

MOVAL,‘*’;“*”的ASCII码送AL寄存器

LEADI,STUDENT_NAME

REPSTOSB

NEXT:

(5)MOVCX,30

CLD

LEASI,STUDENT_NAME

LEADI,PRINT_LINE

REPMOVSB

MOVCX,9

STD

LEASI,STUDENT_ADDR+9-1

LEADI,PRINT_LINE+132-1

REPMOVSB

编写一程序段:

比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串则执行NEW_LESS;否则顺序执行程序。

答:

程序段如下:

MOVCX,5

CLD

MOVDI,SEGOLDS

MOVDS,DI

MOVES,DI

LEASI,OLDS

LEADI,NEWS

REPECMPSB

JNENEW_LESS

NEW_LESS:

请编写一程序段,要求把ECX、EDX和ESI的内容相加,其和存入EDI寄存器中(不考虑溢出)。

答:

MOVEDI,0也可为:

MOVEDI,ECX

ADDEDI,ECXADDEDI,EDX

ADDEDI,EDXADDEDI,ESI

ADDEDI,ESI

试编写一程序段,要求把BL中的数除以CL中的数,并把其商乘以2,最后的结果存入DX寄存器中。

答:

MOVAL,BL

MOVAH,0;假定为无符号数,否则用CBW指令即可

DIVCL

MOVAH,0

SHLAX,1;逻辑左移1位

MOVDX,AX

原(BP)低字节

原(BP)高字节

存储器

002EH

002FH

0030H

0031H

0032H

0033H

0034H

0035H

0036H

0037H

0038H

0039H

003AH

003BH

003CH

003DH

003EH

003FH

0040H

堆栈帧

原(SP)

新(BP)

新(SP)

题的答案

试编写一程序段,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字节单元UP中;找出小于42H的无符号数的个数并存入字节单元DOWN中。

答:

JMPBEGIN;无条件转移

UPDB0

DOWNDB0

TABLEDB100HDUP();数组

BEGIN:

MOVCX,100H

MOVBX,-1;数组下标

MOVSI,0

MOVDI,0

L1:

INCBX

CMPTABLE[BX],42H

JAL2;高于

JBL3;低于

JMPL4;否则跳到L4

L2:

INCSI;UP

JMPL4

L3:

INCDI;DOWN

L4:

LOOPL1

MOVUP,SI

MOVDOWN,DI

1试写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,5和4放在10字数组DATA_LIST的头5个单元中。

然后,写出完整的代码段,其功能为:

把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。

答:

DATA_SEGSEGMENT

NUMDB5

DATA_LISTDW-1,0,2,5,4,5DUP()

MAXDW

MINDW

DATA_SEGENDS

;----------------------------------------------------------------

CODE_SEGSEGMENT

MAINPROCFAR

ASSUMECS:

CODE_SEG,DS:

DATA_SEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DATA_SEG;给DS赋值

MOVDS,AX

MOVCX,4;程序段开始

LEABX,DATA_LIST

MOVAX,[BX]

MOVMAX,AX

MOVMIN,AX

ROUT1:

ADDBX,2

MOVAX,[BX]

CMPAX,MAX

JNGEROUT2

MOVMAX,AX

ROUT2:

CMPAX,MIN

JNLEROUT3

MOVMIN,AX

ROUT3:

LOOPROUT1;程序段结束

RET

MAINENDP

CODE_SEGENDS

;----------------------------------------------------------------

ENDSTART

写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG段中的SUM中。

其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。

答:

程序如下:

D_SEGSEGMENT

AUGWLABELWORD

AUGENDDD99251

SUMDD

D_SEGENDS;以上定义数据段

;----------------------------------------------------------------

E_SEGSEGMENT

ADDWLABELWORD

ADDENDDD-15962

E_SEGENDS;以上定义附加段

;----------------------------------------------------------------

C_SEGSEGMENT

MAINPROCFAR

ASSUMECS:

C_SEG,DS:

D_SEG,ES:

E_SEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,D_SEG

MOVDS,AX;给DS赋值

MOVAX,E_SEG

MOVES,AX;给ES赋值

MOVAX,AUGW;以下6条指令进行加法计算

MOVBX,AUGW+2

ADDAX,ES:

ADDW

ADCBX,ES:

ADDW+2;不考虑有符号数溢出

MOVWORDPTRSUM,AX

MOVWORDPTR[SUM+2],BX

RET

MAINENDP

C_SEGENDS;以上定义代码段

;----------------------------------------------------------------

ENDSTART

试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

答:

程序段如下:

BEGIN:

MOVAH,1;从键盘输入一个字符的DOS调用

INT21H

CMPAL,‘a’;输入字符<‘a’吗

JBSTOP

CMPAL,‘z’;输入字符>‘z’吗

JASTOP

SUBAL,20H;转换为大写字母,用ANDAL,11011111B也可

MOVDL,AL;显示一个字符的DOS调用

MOVAH,2;从键盘输入第二个字符

INT21H

JMPBEGIN

STOP:

RET

编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。

答:

程序段如下:

BEGIN:

MOVAH,1;从键盘输入一个字符的DOS调用

INT21H

CMPAL,‘a’;输入字符<‘a’吗

JBSTOP

CMPAL,‘z’;输入字符>‘z’吗

JASTOP

DECAL;得到前导字符

MOVDL,AL;准备显示三个字符

MOVCX,3

DISPLAY:

MOVAH,2;显示一个字符的DOS调用

INT21H

INCDL

LOOPDISPLAY

STOP:

RET

将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。

答:

程序段如下:

DSEGSEGMENT

STOREDB4DUP()

DSEGENDS

BEGIN:

MOVCL,4;右移四次

MOVCH,4;循环四次

LEABX,STORE

A10:

MOVDX,AX

ANDDX,0FH;取AX的低四位

MOV[BX],DL;低四位存入STORE中

INCBX

SHRAX,CL;右移四次

DECCH

JNZA10;循环四次完了码

B10:

MOVDL,STORE;四组数分别放在AL、BL、CL和DL中

MOVCL,STORE+1

MOVBL,STORE+2

MOVAL,STORE+3

STOP:

RET

试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’,若不相同则显示‘NOMATCH’。

答:

程序如下:

DSEGSEGMENT

STRING1DB‘Iamastudent.’

STRING2DB‘Iamastudent!

YESDB‘MATCH’,0DH,0AH,‘$’

NODB‘NOMATCH’,0DH,0AH,‘$’

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG,ES:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

MOVES,AX;给ES赋值

BEGIN:

LEASI,STRING1;设置串比较指令的初值

LEADI,STRING2

CLD

MOVCX,STRING2-STRING1

REPECMPSB;串比较

JNEDISPNO

LEADX,YES;显示MATCH

JMPDISPLAY

DISPNO:

LEADX,NO;显示NOMATCH

DISPLAY:

MOVAH,9;显示一个字符串的DOS调用

INT21H

RET

MAINENDP

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。

答:

程序段如下:

BEGIN:

MOVAH,1;从键盘输入一个字符的DOS调用

INT21H

SUBAL,‘0’

JBSTOP;输入字符<‘0’吗

CMPAL,9;输入字符>‘9’吗

JASTOP

CBW

MOVCX,AX;响铃次数N

JCXZSTOP

BELL:

MOVDL,07H;准备响铃

MOVAH,2;显示一个字符的DOS调用,实际为响铃

INT21H

CALLDELAY100ms;延时100ms

LOOPBELL

STOP:

RET

编写程序,将一个包含有20个数据的数组M分成两个数组:

正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。

答:

程序如下:

DSEGSEGMENT

COUNTEQU20

ARRAYDW20DUP();存放数组

COUNT1DB0;存放正数的个数

ARRAY1DW20DUP();存放正数

COUNT2DB0;存放负数的个数

ARRAY2DW20DUP();存放负数

ZHENDB0DH,0AH,‘Thepositivenumberis:

’,‘$’;正数的个数是:

FUDB0DH,0AH,‘Thenegativenumberis:

’,‘$’;负数的个数是:

CRLFDB0DH,0AH,‘$’

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVCX,COUNT

LEABX,ARRAY

LEASI,ARRAY1

LEADI,ARRAY2

BEGIN1:

MOVAX,[BX]

CMPAX,0;是负数码

JSFUSHU

MOV[SI],AX;是正数,存入正数数组

INCCOUNT1;正数个数+1

ADDSI,2

JMPSHORTNEXT

FUSHU:

MOV[DI],AX;是负数,存入负数数组

INCCOUNT2;负数个数+1

ADDDI,2

NEXT:

ADDBX,2

LOOPBEGIN1

LEADX,ZHEN;显示正数个数

MOVAL,COUNT1

CALLDISPLAY;调显示子程序

LEADX,FU;显示负数个数

MOVAL,COUNT2

CALLDISPLAY;调显示子程序

RET

MAINENDP

;--------------------------------------------------------------------------

DISPLAYPROCNEAR;显示子程序

MOVAH,9;显示一个字符串的DOS调用

INT21H

AAM;将(AL)中的二进制数转换为二个非压缩BCD码

ADDAH,‘0’;变为0~9的ASCII码

MOVDL,AH

MOVAH,2;显示一个字符的DOS调用

INT21H

ADDAL,‘0’;变为0~9的ASCII码

MOVDL,AL

MOVAH,2;显示一个字符的DOS调用

INT21H

LEADX,CRLF;显示回车换行

MOVAH,9;显示一个字符串的DOS调用

INT21H

RET

DISPLAYENDP;显示子程序结束

CSEGENDS;以上定义代码段

;--------------------------------------------------------------------------

ENDSTART

试编写一个汇编语言程序,求出首地址为DATA(DATA数组)的100D字数组中的最小偶数,并把它存放在AX中。

答:

程序段如下:

BEGIN:

MOVBX,0

MOVCX,100

COMPARE:

MOVAX,DATA[BX];取数组的第一个偶数

ADDBX,2

TESTAX,01H;是偶数吗(偶数与01H逻辑与,不是0,不是偶数)

LOOPNZCOMPARE;不是,比较下一个数

JNZSTOP;没有偶数,退出

JCXZSTOP;最后一个数是偶数,即为最小偶数,退出

COMPARE1:

MOVDX,DATA[BX];取数组的下一个偶数

ADDBX,2

TESTDX,01H;是偶数吗

JNZNEXT;不是,比较下一个数

CMPAX,DX;(AX)<(DX)吗

JLENEXT

MOVAX,DX;(AX)<(DX),则置换(AX)为最小偶数

NEXT:

LOOPCOMPARE1

STOP:

RET

把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。

试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该数(即11B的个数)在终端上显示出来。

(例如:

010分为101010101010101010)

答:

程序段如下:

BEGIN:

MOVDL,0;计数初始值

MOVCX,8

COMPARE:

TESTAX,03H;是数03吗

JNZNOEQUAL;不是,转走

INCDL;是,计数

NOEQUAL:

RORAX,1;准备判断下一个数

RORAX,1

LOOPCOMPARE

ADDDL,‘0’;将计数值转换为ASCII码

MOVAH,2;进行显示

INT21H

STOP:

RET

试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数(1234H),并在终端上显示与它等值的二进制数。

答:

程序段如下:

BEGIN:

MOVBX,0;用于存放四位的16进制数

MOVCH,4

MOVCL,4

INPUT:

SHLBX,CL;将前面输入的数左移4位

MOVAH,1;从键盘取数

INT21H

CMPAL,30H;<0吗

JBINPUT;不是‘0~F’的数重新输入

CMPAL,39H;是‘0~9’吗

JAAF;不是,转‘A~F’的处理

ANDAL,0FH;转换为:

0000B~1001B

JMPBINARY

AF:

ANDAL,11011111B;转换为大写字母

CMPAL,41H;又

JBINPUT;不是‘A~F’的数重新输入

CMPAL,46H;>F吗

JAINPUT;不是‘A~F’的数重新输入

ANDAL,0FH;转换为:

1010B~1111B

ADDAL,9

BINARY:

ORBL,AL;将键盘输入的数进行组合

DELCH

JNZINPUT

DISPN:

MOVCX,16;将16位二进制数一位位地转换成ASCII码显示

DISP:

MOVDL,0

ROLBX,1

RCLDL,1

ORDL,30H

MOVAH,2;进行显示

INT21H

LOOPDISP

STOP:

RET

设有一段英文,其字符变量名为ENG,并以$字符结束。

试编写一程序,查对单词SUN在该文中的出现次数,并以格式“SUN:

xxxx”显示出次数。

答:

程序如下:

DSEGSEGMENT

ENGDB‘Hereissun,sun,…,$’

DISPDB‘SUN:

DATDB‘0000’,0DH,0AH,‘$’

KEYWORDDB‘sun’

DSEGENDS

;--------------------------------------------------------------------------

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG,ES:

DSEG

START:

PUSHDS;设置

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

当前位置:首页 > 外语学习 > 韩语学习

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

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