汇编20题.docx

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

汇编20题.docx

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

汇编20题.docx

汇编20题

汇编语言的特点

∙面向机器的低级语言,通常是为特定的计算机或计算机系列专门设计的。

∙保持了机器语言的优点,具有直接和简捷的特点。

∙可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。

∙目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。

经常与高级语言配合使用,应用十分广泛。

1.5下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其运算结果。

(1)(-85)+76

(2)85+(-76)(3)85-76(4)85-(-76)(5)(-85)-76(6)-85-(-76)

答:

(1)(-85)+76=10101011B+01001100B=11110111B=0F7H;CF=0;OF=0

(2)85+(-76)=01010101B+10110100B=00001001B=09H;CF=1;OF=0

(3)85-76=01010101B-01001100B=01010101B+10110100B=00001001B=09H;CF=0;OF=0

(4)85-(-76)=01010101B-10110100B=01010101B+01001100B=10100001B=0A1H;CF=0;OF=1

(5)(-85)-76=10101011B-01001100B=10101011B+10110100B=01011111B=5FH;CF=0;OF=1

(6)-85-(-76)=10101011B-10110100B=10101011B+01001100B=11110111B=0F7H;CF=0;OF=0

1.8请写出下列字符串的ASCII码值。

Forexample,

Thisisanumber3692.

答:

46H6FH72H20H65H78H61H6DH70H6CH65H2CH0AH0DH

54H68H69H73H20H69H73H20H61H20H6EH75H6DH62H65H72H20H33H36H39H32H2EH0AH0DH

3.1给定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,试确定在以下各种寻址方式下的有效地址是什么?

(1)立即寻址

(2)直接寻址

(3)使用BX的寄存器寻址

(4)使用BX的简接寻址

(5)使用BX的寄存器相对寻址

(6)基址变址寻址

(7)相对基址变址寻址

答:

(1)操作数在指令中,即立即数;

(2)EA=D=7237H;

(3)无EA,操作数为(BX)=637DH;

(4)EA=(BX)=637DH;

(5)EA=(BX)+D=0D5B4H;

(6)EA=(BX)+(SI)=8E18H;

(7)EA=(BX)+(SI)+D=1004FH;超过了段的边界,最高进位位丢失,因此EA=004FH。

3.8假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址为0050H,试指出下列源操作数字段的寻址方式是什么?

其物理地址值是多少?

(1)MOVAX,0ABH

(2)MOVAX,BX

(3)MOVAX,[100H](4)MOVAX,VAL

(5)MOVAX,[BX](6)MOVAX,ES:

[BX]

(7)MOVAX,[BP](8)MOVAX,[SI]

(9)MOVAX,[BX+10](10)MOVAX,VAL[BX]

(11)MOVAX,[BX][SI](12)MOVAX,VAL[BX][SI]

答:

(1)立即寻址方式;操作数在本条指令中

(2)寄存器寻址方式;操作数为(BX)=0100H

(3)直接寻址方式;PA=20100H

(4)直接寻址方式;PA=20050H

(5)BX寄存器间接寻址方式;PA=20100H

(6)附加段BX寄存器间接寻址方式;PA=21100H

(7)BP寄存器间接寻址方式;PA=15010H

(8)SI寄存器间接寻址方式;PA=200A0H

(9)BX寄存器相对寻址方式;PA=20110H

(10)BX寄存器相对寻址方式;PA=20150H

(11)BX和SI寄存器基址变址寻址方式;PA=201A0H

(12)BX和SI寄存器相对基址变址寻址方式;PA=201F0H

3.36假设X和X+2单元的内容为双精度数p,Y和Y+2单元的内容为双精度数q,(X和Y为低位字)试说明下列程序段做什么工作?

MOVDX,X+2;(DX)=(X+2)=PH

MOVAX,X;(AX)=(X)=PL

ADDAX,X;(AX)=(2*X)=2PL

ADCDX,X+2;(DX)=(2*(X+2))=2PH

CMPDX,Y+2;2PH-QH

JLL2;2PHL2

JGL1;2PH>QH------>L1

CMPAX,Y;2PL-QL

JBEL2;2PL<=QL----->L2

L1:

MOVAX,1;(AX)=1

JMPSHORTEXIT;EXIT

L2:

MOVAX,2;(AX)=2

EXIT:

INT20H;EXIT

答:

此程序段判断p*2>q,则使(AX)=1后退出;p*2≤q,则使(AX)=2后退出。

3.37(序程功能3分,注释7分)

要求测试在status中的一个字节,如果第1,3,5位均为1则转移到routine_1,有2位为1则转移到routine_2,有1位为1则转移到routine_3,有0位为1则转移到routine_4

SUBAX,AX

MOVDL,X

TESTDL,01H

JZNEXT1

INCAL

NEXT1:

TESTDL,04H

JZNEXT2

INCAL

NEXT2:

TESTDL,10H

JZNEXT3

INCAL

NEXT3:

CMPAL,2

JGROUTINE_1

CMPAL,1

JGROUTINE_2

CMPAL,0

JGROUTINE_3

JGROUTINE_4

ROUTINE_1:

MOVY,1

JMPEXIT

ROUTINE_2:

MOVY,2

JMPEXIT

ROUTINE_3:

MOVY,3

JMPEXIT

ROUTINE_4:

MOVY,4

EXIT:

ret

 

4.5画图说明下列语句所分配的存储空间及初始化的数据值。

(不是原题)

(1)BYTE_VARDB‘BYTE’,12,-12H,3DUP(0,?

2DUP(1,2),?

(2)WORD_VARDW5DUP(0,1,2),?

-5,‘BY’,‘TE’,256H

答:

(1)BYTE_VARDB'BYTE',12,-12H,3DUP(0,?

2DUP(1,2),?

42,59,54,45,0D,EE,00,?

01,02,01,02,?

00,?

01,02,01,02,?

00,?

01,02,01,02,?

(2)WORD_BARDW5DUP(0,1,2),?

-5,'BY','TE',256H

00,00,01,00,02,00,

00,00,01,00,02,00,

00,00,01,00,02,00,

00,00,01,00,02,00,

00,00,01,00,02,00,

?

?

?

?

FB,FF,59,42,

45,54,56,02

4.14对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?

FLDBDB?

TABLEADW20DUP(?

TABLEBDB‘ABCD’

(1)MOVAX,TYPEFLDB;(AX)=0001H

(2)MOVAX,TYPETABLEA;(AX)=0002H

(3)MOVCX,LENGTHTABLEA;(CX)=0014H

(4)MOVDX,SIZETABLEA;(DX)=0028H

(5)MOVCX,LENGTHTABLEB;(CX)=0001H

5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为0的项,并将后续项向前压缩,最后将数组的剩余部分补上0。

DSEGSEGMENT

MEMDW100DUP(?

DSEGENDS

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG,ES:

DSEG

START:

PUSHDS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX

MOVES,AX

BEGIN:

MOVSI,(100-1)*2

MOVBX,-2

MOVCX,100

COMP:

ADDBX,2

CMPMEM[BX]

JZCONS

LOOPCOMP

JMPFINISH

CONS:

MOVDI,BX

CONS1:

CMPDI,SI

JAENOMOV

MOVAX,MEM[DI+2]

MOVMEM[DI],AX

ADDDI,2

JMPCONS1

NOMOV:

MOVWORDPTR[SI],0

LOOPCOMP

FINISH:

RET

MAINENDP

CSEGENDS

ENDSTART

 

5.14在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次数最多的数及其出现次数分别存放于AX和CX中。

TABLEDW100HDUP(?

DATADW?

COUNTDW0

BEGIN:

MOVBX,100H

MOVDI,0

NEXT:

MOVDX,0

MOVSI,0

MOVAX,TABLE[DI]

MOVCX,100H

COMP:

CMPTABLE[SI],AX

JNEADDR

INCDX

ADDR:

ADDSI,2

LOOPCOMP

CMPDX,COUNT

JLEDONE

MOVCOUNT,DX

MOVDATA,AX

DONE:

ADDDI,2

DECBX

JNZNEXT

MOVCX,COUNT

MOVAX,DATA

RET

 

5.18把0~100D之间的30个数存入以GRADE为首地址的30字数组中,GRADE+i表示学号为i+1的学生的成绩。

另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。

编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。

(提示:

一个学生的名次等于成绩高于这个学生的人数加1。

答:

程序如下:

DSEGSEGMENT

GRADEDW30DUP(?

);假设已预先存好30名学生的成绩

RANKDW30DUP(?

DSEGENDS

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

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVDI,0

MOVCX,30;外循环计数器

LOOP1:

PUSHCX

MOVCX,30;内循环计数器

MOVSI,0

MOVAX,GRADE[DI]

MOVDX,1;起始名次为第1名

LOOP2:

CMPGRADE[SI],AX;成绩比较

JBEGO_ON

INCDX;名次+1

GO_ON:

ADDSI,2

LOOPLOOP2

POPCX

MOVRNAK[DI],DX;名次存入RANK数组

ADDDI,2

LOOPLOOP1

RET

MAINENDP

CSEGENDS;以上定义代码段

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

ENDSTART

 

实验一:

一、实验内容

比较字符串:

试编写一程序:

比较两个字符串String1和String2所含的字符是否相同。

若相同则显示‘Match',否则,显示'NoMatch!

'

datasegment

string1db'Movethecursorbackward.'

string2db'MovetheSursorbackward.'

mess1db'Match.',13,10,'$'

mess2db'Nomatch!

',13,10,'$'

dataends

programsegment

mainprocfar

assumecs:

program,ds:

data,es:

data

start:

pushds

subax,ax

pushax

movax,data

movds,ax

moves,ax

leasi,string1

leadi,string2

cld

movcx,25

repzcmpsb

jzmatch

leadx,mess2

jmpshortdisp

match:

leadx,mess1

disp:

movah,9

int21h

ret

mainendp

programends

endstart

 

实验三:

分支程序设计

实验内容

统计学生成绩result:

试编写一程序:

设有10个学生的成绩分别为56,69,84,82,73,88,99,63,100,80分。

试编写程序分别统计低于60分、60~69分,70~79分,80~89分,90~99分及100分的人数,并分别存放到s5,s6,s7,s8,s9,s10单元中。

(提示:

成绩分等部分采用分支结构,统计所有成绩则用循环结构完成。

DATASSEGMENT

GRADEDW56,69,84,82,73,88,99,63,100,80

S5DW0

S6DW0

S7DW0

S8DW0

S9DW0

S10DW0

;此处输入数据段代码

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

;此处输入代码段代码

MOVCX,10

MOVBX,OFFSETGRADE

COMPARE:

MOVAX,[BX]

CMPAX,60

JLFIVE

CMPAX,70

JLSIX

CMPAX,80

JLSEVEN

CMPAX,90

JLEIGHT

CMPAX,100

JLNINE

INCS10

JMPSHORTCHANGE_ADDR

NINE:

INCS9

JMPSHORTCHANGE_ADDR

EIGHT:

INCS8

JMPSHORTCHANGE_ADDR

SEVEN:

INCS7

JMPSHORTCHANGE_ADDR

SIX:

INCS6

JMPSHORTCHANGE_ADDR

FIVE:

INCS5

CHANGE_ADDR:

ADDBX,2

LOOPCOMPARE

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

 

6.3分析下面的程序,画出堆栈最满时各单元的地址及内容。

;********************************************

S_SEGSEGMENTAT1000H;定义堆栈段

DW200DUP(?

);200*2=190H

TOSLABELWORD

S_SEGENDS

;********************************************

C_SEGSEGMENT;定义代码段

ASSUMECS:

C_SEG,SS:

S_SEG

START:

MOVAX,S_SEG

MOVSS,AX

MOVSP,OFFSETTOS

PUSHDS

MOVAX,0

PUSHAX

PUSHT_ADDR

PUSHAX

PUSHF

POPF

POPAX

POPT_ADDR

RET

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

C_SEGENDS;代码段结束

;******************************************

ENDSTART;程序结束

1000:

0186

(FLAGS)

1000:

0188

(AX)

1000:

018A

(t_addr)

1000:

018C

0000

1000:

018E

(DS)

SP:

0186

6.4分析下面的程序,写出堆栈最满时各单元的地址及内容。

;********************************************

STACKSEGMENTAT500H;定义堆栈段

DW128DUP(?

TOSLABELWORD

STACKENDS

;********************************************

CODESEGMENT;定义代码段

MAINPROCFAR;主程序部分

ASSUMECS:

CODE,SS:

STACK

START:

MOVAX,STACK

MOVSS,AX

MOVSP,OFFSETTOS

PUSHDS

SUBAX,AX

PUSHAX

;MAINPARTOFPROGRAMGOESHERE

MOVAX,4321H

CALLHTOA

RET

MAINENDP;主程序部分结束

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

HTOAPROCNEAR;HTOA子程序

CMPAX,15

JLEB1

PUSHAX

PUSHBP

MOVBP,SP

MOVBX,[BP+2]

ANDBX,000FH

MOV[BP+2],BX

POPBP

MOVCL,4

SHRAX,CL

CALLHTOA

POPAX

B1:

ADDAL,30H

CMPAL,3AH

JLPRINTIT

ADDAL,7H

PRINTIT:

MOVDL,AL

MOVAH,2

INT21H

RET

HOTAENDP;HOTA子程序结束

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

CODEENDS;代码段结束

;******************************************

ENDSTART;程序结束;********************************************

500:

00EC

500:

00EE

IP

500:

00F0

0003H

500:

00F2

IP

500:

00F4

0002H

500:

00F6

IP

500:

00F8

0001H

500:

00FA

IP

500:

00FC

0000

500:

00FE

(DS)

SP:

00EE

 

6.7设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。

试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。

答:

程序如下:

DSEGSEGMENT

RECORDDW76,69,84,90,73,88,99,63,100,80

S6DW0

S7DW0

S8DW0

S9DW0

S10DW0

DSEGENDS

;******************************************

CSEGSEGMENT

MAINPROCFAR

ASSUMECS:

CSEG,DS:

DSEG

START:

PUSHDS;设置返回DOS

SUBAX,AX

PUSHAX

MOVAX,DSEG

MOVDS,AX;给DS赋值

BEGIN:

MOVCX,10

CALLCOUNT

┇;后续程序

RET

MAINENDP

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

COUNTPROCNEAR;成绩统计子程序

MOVSI,0

NEXT:

MOVAX,RECORD[SI]

MOVBX,10;以下5句是根据成绩计算相对S6的地址变化量

DIVBL;计算公式为:

((成绩)/10-6)*2送(BX)

MOVBL,AL;此时(BH)保持为0不变

SUBBX,6;应为只统计60分以上成绩

SALBX,1;(BX)*2

INCS6[BX];S6是S6,S7,S8,S9和S10单元的首地址

ADDSI,2

LOOPNEXT

RET

COUNTENDP;COUNT子程序结束

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

CSEGENDS;以上定义代码段

;******************************************

ENDSTART

 

7.3给定宏定义

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

当前位置:首页 > 医药卫生 > 中医中药

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

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