汇编20题.docx
《汇编20题.docx》由会员分享,可在线阅读,更多相关《汇编20题.docx(20页珍藏版)》请在冰豆网上搜索。
汇编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给定宏定义