微機原理與接口技術 第4章課后作業(yè)答案
1 第4章 匯編語言程序設計4.1請分別用DB 、DW 、DD偽指令寫出在DATA開始的連續(xù)8個單元中依次存放數(shù)據(jù)11H 、22H 、33H 、44H 、55H 、66H 、77H 、88H的數(shù)據(jù)定義語句. 解:DB,DW,DD偽指令分別表示定義的數(shù)據(jù)為字節(jié)類型、字類型及雙字型.其定義形式為: DATA DB 11H,22H,33H,44H,55H,66H,77H,88H DATA DW 2211H,4433H,6655H,8877H DATA DD 44332211H,88776655H4.2若程序的數(shù)據(jù)段定義如下,寫出各指令語句獨立執(zhí)行后的結(jié)果:DSEG SEGMENTDATA1 DB 10H,20H,30HDATA2 DW 10 DUP(?)STRING DB 123DSEG ENDS (1) MOV AL,DATA1(2) MOV BX,OFFSET DATA2(3) LEA SI,STRINGADD DI,SI解:(1)取變量DATA1的值. 指令執(zhí)行后,(AL)=10H.(2)變量DATA2的偏移地址. 指令執(zhí)行后,(BX)=0003H. 2 (3)先取變量STRING的偏移地址送寄存器SI,之后送SI的內(nèi)容與DI的內(nèi)容相加并將結(jié)果送DI.指令執(zhí)行后,(SI)=0017H;(DI)=(DI)+0017H.4.3 試編寫求兩個無符號雙子長數(shù)之和的程序. 兩數(shù)分別在MEM1和MEM2單元中,和放在SUM單元.解:DSEG SEGMENTMEM1 DW 1122H,3344HMEM2 DW 5566H,7788HSUM DW 2 DUP(?)DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEG MOV DS,AX LEA BX,MEM1 LEA SI,MEM2LEA DI,SUMMOV CL,2CLCAGAIN: MOV AX,BX 3 ADC AX,SIMOV DI,AXADD BX,2ADD SI,2ADD DI,2LOOP AGAINHLTCSEG ENDSEND START4.4試編寫程序,測試AL寄存器的第4位(bit4)是否為0?解: 測試寄存器AL中某一位是否為0,可使用TEST指令、AND指令、移位指令等幾種方法實現(xiàn)。如:TEST AL,10H JZ NEXT .NEXT:或者: MOV CL,4 SHL AL,CL JNC NEXT.NEXT: 4 4.5 試編寫程序,將BUFFER中的一個8位二進制數(shù)轉(zhuǎn)換為ASCII碼,并按位數(shù)高低順序存放在ANSWER開始的內(nèi)存單元中。解:DSEG SEGMENTBUFFER DB ?ANSWER DB 3 DUP(?)DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV CX,3;最多不超過3為十進制數(shù)(255)LEA DI, ANSWER;DI指向結(jié)果存放單元 XOR AX,AXMOV AL,BUFFER;取要轉(zhuǎn)換的二進制數(shù)MOV BL,0AH;基數(shù)10AGAIN:DIV BL;用除10取余的方法轉(zhuǎn)換ADD AH,30H;十進制數(shù)轉(zhuǎn)換成ASCII碼MOV DI, AH;保存當前的結(jié)果INC DI;指向下一個位保存單元 5 AND AL,AL ;商為0?(轉(zhuǎn)換結(jié)束?)JZ STO;若結(jié)束,退出MOV AH,0LOOP AGAIN;否則循環(huán)繼續(xù)STO:MOV AX,4C00HINT 21H;返回DOSCSEG ENDSEND START4.6 假設數(shù)據(jù)項定義如下:DATA1 DB HELLO!GOOD MORNING!DATA2 DB 20 DUP(?)用串操作指令編寫程序段,使其分別完成以下功能:(1)從左到右將DATA1中的字符串傳送到DATA2中。(2)傳送完后,比較DATA1和DATA2中的內(nèi)容是否相同。 (3)把DATA1中的第3和第4個字節(jié)裝入AX。(4)將AX的內(nèi)容存入DATA2+5開始的字節(jié)單元中。解:(1)MOV AX,SEG DATA1MOV DS,AXMOV AX,SEG DATA2 6 MOV ES,AXLEA SI,DATA1LEA DI,DATA2MOV CX,20CLDREP MOVSB(2)LEA SI,DATA1LEA DI,DATA2MOV CX,20CLD REPE CMPSB。 (3)LEA SI,DATA1ADD SI,2LODSW(4)LEA DI,DATA2 ADD DI,5 STOSW 7 4.7執(zhí)行下列指令后,AX寄存器的內(nèi)容是多少?TABLE DW 10,20,30,40,50ENTRY DW 3.MOV BX,OFFSET TABLEADD BX,ENTRYMOV AX,BX解:(AX)=1E00H4.8 編寫程序段,將STRING1中的最后20個字符移到STRING2中(順序不變)。解:首先確定STRING1中字符串的長度,因為字符串的定義要求以$符號結(jié)尾,可通過檢測$符確定出字符串的長度,設串長度為COUNT,則程序如下: LEA SI,STRING1LEA DI,STRING2ADD SI,COUNT-20MOV CX,20CLDREP MOVSB 8 4.9 假設一個48位數(shù)存放在DX:AX:BX中,試編寫程序段,將該48位數(shù)乘以2.解: 可使用移位指令來實現(xiàn)。首先將BX內(nèi)容邏輯左移一位,其最高位移入進位位CF,之后AX內(nèi)容帶進位位循環(huán)左移,使AX的最高位移入CF,而原CF中的內(nèi)容(即BX的最高位)移入AX的最低位,最后再將DX內(nèi)容帶進位位循環(huán)左移一位,從而實現(xiàn)AX的最低位移入DX的最低位。SHL BX,1RCL AX,1RCL DX,14.10 試編寫程序,比較AX,BX,CX中帶符號數(shù)的大小,并將最大的數(shù)放在AX中。解:比較帶符號數(shù)的大小可使用符號數(shù)比較指令JG等。CMP AX,BXJG NEXT1XCHG AX,BX NEXT1:CMP AX,CXJG STOMOV AX,CX STO:HLT4.11 若接口03F8H的第1位(b1)和第3位(B3)同時為1,表示接口03FBH有準備好的8位數(shù)據(jù),當CPU將數(shù)據(jù)取走后,b1和b3就不再同時為1了。僅當又有數(shù)據(jù)準備好時才再同時為1。試編寫程序,從上述接口讀入200字節(jié)的數(shù)據(jù),并順序放在DATA開始的地址中。 9 解:即當從輸入接口03F8H讀入的數(shù)據(jù)滿足11B時可以從接口03FBH輸入數(shù)據(jù)。LEA SI,DATAMOV CX,200NEXT: MOV DX,03F8HWAIT: IN AL,DXAND AL,0AH;判斷b1和b3位是否同時為1CMP AL,0AHJNZ WAIT;b1和b3位同時為1則讀數(shù)據(jù),否則等待MOV DX,03FBHIN AL,DXMOV SI,ALINC SI LOOP NEXTHLT4.12 畫圖說明下列語句分配的存儲空間及初始化的數(shù)據(jù)值。(1)DATA1 DB BYTE,12,12H,2 DUP(0,?,3)(2)DATA2 DW 4 DUP(0,1,2),?,-5,256H解: (1) 存儲空間分配情況如圖(a)所示。 (2) 存儲空間分配情況如圖(b)所示。 1003H?00H03H?00H12H0CH45H 54H59H42HDATA1 BYTE隨機數(shù)隨機數(shù)高地址方向 ( a ) ?FBH 00H01H00H02H00H00H00H01H00H02H00H00H00H 01H00H02H00H00H00H01H00H02H00H 00H 02H56HFFH DATA2 5 高地址方向 ( b )