资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,4,章 汇编语言程序设计,4.1,请分别用,DB,、,DW,、,DD,伪指令写出在,DATA,开始的连续,8,个单元中依次存放数据,11H,、,22H,、,33H,、,44H,、,55H,、,66H,、,77H,、,88H,的数据定义语句,.,解,:DB,DW,DD,伪指令分别表示定义的数据为字节类型、字类型及双字型,.,其定义形式为,:,DATA DB 11H,22H,33H,44H,55H,66H,77H,88H,DATA DW 2211H,4433H,6655H,8877H,DATA DD 44332211H,88776655H,4.2,若程序的数据段定义如下,写出各指令语句独立执行后的结果,:,DSEG SEGMENT,DATA1 DB 10H,20H,30H,DATA2 DW 10 DUP(?),STRING DB 123,DSEG ENDS,(1) MOV AL,DATA1,(2) MOV BX,OFFSET DATA2,(3) LEA SI,STRING,ADD DI,SI,解,:,取变量,DATA1,的值,.,指令执行后,(AL)=10H.,变量,DATA2,的偏移地址,.,指令执行后,(BX)=0003H.,1,(3),先取变量,STRING,的偏移地址送寄存器,SI,之后送,SI,的内容与,DI,的内容相加并将结果送,DI.,指令执行后,(SI)=0017H;(DI)=(DI)+0017H.,4.3,试编写求两个无符号双子长数之和的程序,.,两数分别在,MEM1,和,MEM2,单元中,和放在,SUM,单元,.,解,:,DSEG SEGMENT,MEM1 DW 1122H,3344H,MEM2 DW 5566H,7788H,SUM DW 2 DUP(?),DSEG ENDS,CSEG SEGMENT,ASSUME CS:CSEG,DS:DSEG,START: MOV AX,DSEG,MOV DS,AX,LEA BX,MEM1,LEA SI,MEM2,LEA DI,SUM,MOV CL,2,CLC,AGAIN: MOV AX,BX,2,ADC AX,SI,MOV DI,AX,ADD BX,2,ADD SI,2,ADD DI,2,LOOP AGAIN,HLT,CSEG ENDS,END START,4.4,试编写程序,测试,AL,寄存器的第,4,位,(bit4),是否为,0?,解,:,测试寄存器,AL,中某一位是否为,0,可使用,TEST,指令、,AND,指令、移位指令等几种方法实现。,如:,TEST AL,,,10H,JZ NEXT,.,.,.,NEXT,:,或者:,MOV CL,,,4,SHL AL,,,CL,JNC NEXT,.,NEXT:,3,4.5,试编写程序,将,BUFFER,中的一个,8,位二进制数转换为,ASCII,码,并按位数高低顺序存放在,ANSWER,开始的内存单元中。,解:,DSEG SEGMENT,BUFFER DB,?,ANSWER DB 3 DUP,(?),DSEG ENDS,CSEG SEGMENT,ASSUME CS,:,CSEG,,,DS,:,DSEG,START,:,MOVAX,,,DSEG,MOV DS,,,AX,MOV CX,,,3,;最多不超过,3,为十进制数(,255,),LEA DI,,,ANSWER,;,DI,指向结果存放单元,XOR AX,,,AX,MOV AL,,,BUFFER,;取要转换的二进制数,MOV BL,,,0AH,;基数,10,AGAIN,:,DIV BL,;用除,10,取余的方法转换,ADD AH,,,30H,;十进制数转换成,ASCII,码,MOV DI,,,AH,;保存当前的结果,INC DI,;指向下一个位保存单元,4,AND AL,,,AL,;商为,0,?(转换结束?),JZ STO,;若结束,退出,MOV AH,,,0,LOOP AGAIN,;否则循环继续,STO,:,MOV AX,,,4C00H,INT 21H,;返回,DOS,CSEGENDS,END START,4.6,假设数据项定义如下:,DATA1 DB HELLO,!,GOOD MORNING,!,DATA2 DB 20 DUP,(?),用串操作指令编写程序段,使其分别完成以下功能:,(,1,)从左到右将,DATA1,中的字符串传送到,DATA2,中。,(,2,)传送完后,比较,DATA1,和,DATA2,中的内容是否相同。,(,3,)把,DATA1,中的第,3,和第,4,个字节装入,AX,。,(,4,)将,AX,的内容存入,DATA2+5,开始的字节单元中。,解:,(,1,),MOV AX,,,SEG DATA1,MOV DS,,,AX,MOV AX,,,SEG DATA2,5,MOV ES,,,AX,LEA SI,,,DATA1,LEA DI,,,DATA2,MOV CX,,,20,CLD,REP MOVSB,(,2,),LEA SI,,,DATA1,LEA DI,,,DATA2,MOV CX,,,20,CLD,REPE CMPSB,。,(,3,),LEA SI,,,DATA1,ADD SI,,,2,LODSW,(,4,),LEA DI,,,DATA2,ADD DI,,,5,STOSW,6,4.7,执行下列指令后,,AX,寄存器的内容是多少?,TABLE DW 10,,,20,,,30,,,40,,,50,ENTRY DW 3,.,.,.,MOV BX,,,OFFSET TABLE,ADD BX,,,ENTRY,MOV AX,,,BX,解:(,AX,),=1E00H,4.8,编写程序段,将,STRING1,中的最后,20,个字符移到,STRING2,中(顺序不变)。,解:首先确定,STRING1,中字符串的长度,因为字符串的定义要求以,$,符号结尾,,可通过检测,$,符确定出字符串的长度,设串长度为,COUNT,,则程序如下:,LEA SI,,,STRING1,LEA DI,,,STRING2,ADD SI,,,COUNT-20,MOV CX,,,20,CLD,REP MOVSB,7,4.9,假设一个,48,位数存放在,DX:AX:BX,中,试编写程序段,将该,48,位数乘以,2.,解,:,可使用移位指令来实现。首先将,BX,内容逻辑左移一位,其最高位移入进位位,CF,,之后,AX,内容带进位位循环左移,使,AX,的最高位移入,CF,,而原,CF,中的内容(即,BX,的最高位)移入,AX,的最低位,最后再将,DX,内容带进位位循环左移一位,从而实现,AX,的最低位移入,DX,的最低位。,SHL BX,,,1,RCL AX,,,1,RCL DX,,,1,4.10,试编写程序,比较,AX,,,BX,,,CX,中带符号数的大小,并将最大的数放在,AX,中。,解:比较带符号数的大小可使用符号数比较指令,JG,等。,CMP AX,,,BX,JG NEXT1,XCHG AX,,,BX,NEXT1,:,CMP AX,,,CX,JG STO,MOV AX,,,CX,STO,:,HLT,4.11,若接口,03F8H,的第,1,位,(b1),和第,3,位(,B3,)同时为,1,,表示接口,03FBH,有准备好的,8,位数据,当,CPU,将数据取走后,,b1,和,b3,就不再同时为,1,了。仅当又有数据准备好时才再同时为,1,。,试编写程序,从上述接口读入,200,字节的数据,并顺序放在,DATA,开始的地址中。,8,解:即当从输入接口,03F8H,读入的数据满足,11B,时可以从接口,03FBH,输入数据。,LEA SI,,,DATA,MOV CX,,,200,NEXT,:,MOV DX,,,03F8H,WAIT,:,IN AL,,,DX,AND AL,,,0AH,;判断,b1,和,b3,位是否同时为,1,CMP AL,,,0AH,JNZ WAIT,;,b1,和,b3,位同时为,1,则读数据,否则等待,MOV DX,,,03FBH,IN AL,,,DX,MOV SI,,,AL,INC SI,LOOP NEXT,HLT,4.12,画图说明下列语句分配的存储空间及初始化的数据值。,(,1,),DATA1 DB BYTE,,,12,,,12H,,,2 DUP,(,0,,?,,3,),(,2,),DATA2 DW 4 DUP,(,0,,,1,,,2,),?,,-5,,,256H,解,: (,1,) 存储空间分配情况如图(,a,)所示。,(,2,) 存储空间分配情况如图(,b,)所示。,9,03H,?,00H,03H,?,00H,12H,0CH,45H,54H,59H,42H,DATA1,B,Y,T,E,随机数,随机数,高地址方向,( a ),?,?,FBH,00H,01H,00H,02H,00H,00H,00H,01H,00H,02H,00H,00H,00H,01H,00H,02H,00H,00H,00H,01H,00H,02H,00H,00H,02H,56H,FFH,DATA2,5,高地址方向,( b ),10,
展开阅读全文