第4章习题及参考解答第4章习题及参考解答1.试编一程序,把地址偏移量为100H单元开始的256个单元分别写入00H,01H,02H,03H,…,FFH 数据。
解源程序如下DATA SEGMENTORG 100HBUF1 DB 256 DUP(?)COUNT EQU$-BUF1DATA ENDSSTK SEGMENT STACKDB 100 DUP(?)STK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:M OV AX,DATAMOV DS,AXMOV SI,OFFSET BUF1 ;戓LEA SI,BUF1MOV CX,COUNTXOR AL,AL ;或MOV AL,00HNEXT:MOV [SI],ALINC ALINC SILOOP NEXTMOV AH,4CHINT 21 HCODE ENDSEND START2.统计上题写入的数据块中0元素、正元素、负元素的个数,并分别把统计结果送入上述数据块之后的三个单元中。
解DATA SEGMENTO RG 100HBUF1 DB 00H,01H.02H,…,0FEH,0FFH ;共256个数据COUNT EOU$-BUF1DB 3 DUP(?)DATA E NDSSTK SEGMENT STACKDB 100 DUP(?)STK ENDSCODE SEGMENTA SSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV S1,OFFSET BUF1MOC CX,COUNTXOR BX,BX ;BL与BH分别存放正、负元素的个数XOR DH,DH ;DH寄存器存放0元素个数NEXT2: MOV AL,[SI]CMP AL,0JZ ZER0 ;若ZF=1,则为0,转至ZERO,DH+1JS NEGAT ;若SF=0则为负数,BH+1INC BL ;既不是0又不是负,则为正数,BL+1JMP NEXT3ZERO: INC DH ;0的个数加1 J MP NEXT3NEGAT:INC BH ;负数个数加1 NEXT3: INC SI ;修改地址指针SI L OOP NEXT2 ;未完,继续循环M OV [SI],DH ;存入0元素个数统计结果I NC SIM OV [SI],BX ;存入正、负数个数统计结果M OV AH,4CHI NT 21HCODE ENDSE ND START4.把地址偏移量为STRG1单元开始的128个单元的内容传送到地址偏移量为STRG2开始的单元中。
解DATA SEGMENTSTRGl DB XXH,XXH,XXH,….XXH;1 28个数据COUNT EOU$-STRGlSTRG2 DB 128 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET STRG1MOV DI,OFFSET STRG2MOV CX,COUNTCLDREP MOVSBMOV AH,4CHINT 21 HCODE ENDSEND START5.寄存器SI做地址指针,自SI所指的内存单元开始连续存放三个无符号数(以字为单位),编一程序求它们的和,并将结果存放在这三个数之后的单元中。
解DATA SEGMENTBUF DW XXH,YYH,ZZHSUM DW ?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET BUFMOV DI,OFFSET SUMMOV AX,[SI]ADD AX,[SI+2]MOV [DI],AXMOV AX,0ADDC AX,0MOV [DI+2],AXMOV AX,[DI]ADDC AX,[SI+4]MOV [DI],AXMOV AX,0ADDC AX,[DI+2]MOV [DI+2],AXMOV AH,4CHINT 21HCODE ENDSEND START6.读下面程序段,问:在什么情况下本段程序的执行结果是AH=0?START:IN AL,5FHMOV AH,0JZ BRCHMOV AH,0JMP STOPBRCH:MOV AH,0FFHSTOP:INT 20H解当标志寄存器的ZF=0时,执行结果AH=0。
(JZ之前的两条指令对零标志没有影响)7.下面语句在存储器中分别为变量分配多少字节? 0NE DW 10TW0 DW 4 DUP(?),5THREE DB 2 DUP(?,8 DUP(0))COUNT EQU 10FOUR DD COUNT DUP(?)FIVE DB‘HOW ARE YOU?’解ONE DW 10 ;为ONE分配2个字节TWO DW 4 DUP(?),5 ;为TWO分配10个字节THREE DB 2 DUP(?,8 DUP(0)) ;为THREE 分配18个字节COUNT EQU 10 ;不给COUNT分配存储单元FOUR DD COUNT DUP(?) ;为FOUR分配40个字节FIVE DB ‘HOW ARE YOU?’;为FIVE分配12个字节8.数据定义语句如下所示:FIRST DB 90H,5FH,6EH,69HSECOND DB 5 DUP(?)THIRD DB 5 DUP(?)FORTH DB DUP(?)自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:(1)编一段程序将这个数左移两位后存放到自SECOND开始的单元(注意保留移出部分);(2)编一段程序将这个数右移两位后存放到自THIRD开始的单元(注意保留移出部分);(3)编一段程序将这个数求补后存放到自FORTH开始的单元。
解DATA SEGMENTFIRST DB 90H,5FH,6EH,69HSECOND D B 5 DUP (?)THIRD DB 5 DUP (?)FORTH DB DUP (?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:M OV AX,DATAMOV DS,AXCALL SUBP1CALL SUBP2CALL SUBP3MOV AH,4CHINT 21HSUBP1 PROCMOV SI,OFFSET FIRSTMOV DI,OFFSET SECONDXOR BL,BLMOV CL,2MOV AX,[SI]MOV DX,[SI+2]LOP1:SHL AX,1RCL DX,1RCL BL,1DEC CLJNZ LOP1MOV [DI],AXMOV [DI+2],DXMOV [DI+4],BLRETSUBP1 ENDPSUBP2 PROCMOV SI,OFFSET FIRSTMOV DI,OFFSET THIRDXOR BL,BLMOV CL,2MOV AX,[SI]MOV DX,[SI+2]LOP2:SHR DX,1RCR AX,1RCR BL,1DEC CLJNZ LOP2MOV [DI],BLMOV [DI+1],AXMOV [DI+3],DXRETSUBP2 ENDPSUBP3 PROCMOV SI,OFFSET FIRSTMOV DI,OFFSET FORTHMOV AX,[SI]MOV DX,[SI+2]NOT AXNOT DXADD AX,1ADC DX,0MOV [DI],AXMOV [DI+2],DXRETSUBP3 ENDPCODE ENDSEND START9.指令语句AND AX,OPD1 AND OPD2中,OPD1和OPD2是两个已赋值的变量,问两个AND操作分别在什么时间进行?有什么区别?解前面的AND是指令,在程序运行时执行,后面的AND是运算符,在汇编的时候由汇编程序计算,表达式计算结果出现在执行程序中。
二者的区别在于,前者是指令,程序运行时执行,后者是运算符,汇编时计算。
10.如下指令或程序是否有错,若有错,请指出错在哪里?(1)KI EOU 1024┇MOV K1,AX(2) MOV DS,100MOV [1000],[2000](3)IMP DB ?┇MOV IMP,AX(4)A1 DB ?A2 DB 10┇CMP A1,A2(5)将1000送入X1单元,用如下程序:X1 DB ?┇MOV BX,X1MOV [BX],1000解(1)MOV K1,AX错。
因为K1为立即数,它不能作为目的操作数。
(2)这两条指令都是错的。
第一条立即数不能直接送给段寄存器;第二条两个操作数不能同时为内存操作数。
(3)MOV IMP,AX错。
两操作数类型不匹配,IMP 是一字节内存单元,而AX寄存器中为16位数据。
(4)CMP A1,A2错。
两个操作数A1与A2不能同时为内存操作数。
(5)MOV [BX],1000错。
两操作数类型不匹配,[BX]只定义了一字节单元,而1000是16位数据。
11.8086汇编语言程序中段的类型有几种?各段如何定义?段定义语句中,定位类型、组合类型、类别各起什么作用?各有什么含义?解8086汇编语言中,段的类型有三种,即代码段、堆栈段、数据段(附加数据段可归属于数据段)。
各段可用段定义语句(SEGMENT与ENDS)和段名赋给段寄存器语句(ASSUME)来定义。
段定义语句中,定位类型表示此段的起始边界要求,可允许4种段的起始边界,即PAGE、PARA、WORD或BYTE。
它们分别表示段的起始值为以页、节、字、字节为边界,若此项省略,则默认值为PARA。
组合类型用来告诉连接程序本段与其他段的关系,分别为NONE、PUBLIC、COMMON、AT表达式、STACK或MEMORY。
每一种的含义请参看主教材。
类别是连接程序(LINK)需要的。
它可以是任何合法的名称,必须用单引号括起来,连接程序只使同类别的段发生关联。
典型类别如‘CODE’、'STACK'。
12.使用DOS功能调用0AH从键盘输入40个字符的字符串并将其送入一输入缓冲区。
在按下Enter键后,显示这些字符。
解NAME KBDINPUTCODE SEGMENTASSUME CS:CODE,DS:CODEORG 100HSTART:JMP BEGINBUF DB41NUMB DB ?CHARS DB 41 DUP(?)MSG1DB'Type anything,followed by enter.',0DH,0AH,'$'MSG2 DB 0DH,0AH,'Contents of the KBD input buf:',0DH,0AH,'$'BEGIN:MOV AX,CSMOV DS,AXMOV DX,OFFSET MSG1MOV AH,9INT 21HMOV DX,OFFSET BUFMOV AH,0AHINT 21 HMOV DX,OFFSET MSG2MOV AH,9INT 21HXOR BX,BXMOV BL,NUMBMOV CHARS[BX],'$'MOV DX,OFFSET CHARSMOV AH,9INT 21HMOV AH,4CHINT 21HCODE ENDSEND START说明本题把数据区放在代码段中,没有单独定义数据段。