汇编与接口 第六章作业
《微机原理与接口技术》第六章作业答案

《微机原理与接口技术》第六章作业一、P207:1,3,5,10,1418,19,201、什么叫中断?中断系统的主要功能有哪些?中断:是指CPU在执行程序的过程中,由于某种外部或内部事件的作用,强迫CPU停止当前正在执行的程序,转去为该事件服务,待事件服务结束后,能自动地返回到被中断的程序中继续执行。
中断系统的功能:1、设置中断源2、中断源识别3、中断源判优4、中断与返回3、CPU 响应中断时的处理过程是什么?在各个处理环节主要完成哪些操作?过程是:中断请求、中断响应、中断处理和中断返回。
(1)中断请求:中断源需要进行中断服务时,由硬件产生一个中断信号INTR 发给CPU 且保持到CPU 响应。
(2)中断响应:CPU 在当前指令执行结束后采样查询INTR ,若中断请求信号有效且允许响应INTR 中断(IF=1),则向请求设备送回低电平有效的中断响应信号INTR , 自此系统自动进入中断响应周期,并由硬件自动完成内容入栈,清除TF 和IF标志、断点入栈,取中断服务程序的入口地址等一系列操作,继而转去执行中断服务程序。
(3)中断处理:执行中断的主体部分。
不同的中断请求源,其中断处理的内容是不同的。
需要根据中断请求源所要完成的功能,编写相应的中断服务程序存入内存。
等待中断响应后调用执行。
(4)中断返回:又中断服务程序中的中断返回指令IRET 完成。
执行该指令时,将压入对战的断点和标志位弹出,使CPU 转向被中断的现行程序中继续执行。
5、中断允许标志IF的作用是什么? 可以用什么指令对它置1或清0。
IF用来控制INTR和单步中断。
IF=1允许中断 IF=0不允许中断STI:IF=1CLI:IF=010、中断向量表用来存放什么内容?它占用多大的存储空间?存放在内存的哪个区域?可以用什么方法写入或者读取中断向量表的内容?中断向量表存放中断向量,即中断服务程序的段基址+偏移地址。
中断向量表占1KB 内存RAM区,地址范围:000H—3FFH。
汇编第六章答案

第六章答案=======================================1.下面的程序段有错吗?若有,请指出错误.CRAY PROCPUSH AXADD AX,BXRETENDP CRAY[解]:当然有错误,ENDP CRAY写反了,应该将其改成CRAY ENDP.2.已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令.然后再执行一POP指令.试画出示意图说明堆栈及SP内容的变化过程.3.分析下面"6,3的程序",画出堆栈最满时各单元的地址及内容.; 6.3题的程序;===========================================S_SEG SEGMENT AT 1000H ;DEFINE STACK SEGMENTDW 200 DUP(?)TOS LABEL WORDS_SEG ENDSC_SEG SEGMENT ;DEFINE CODE SEGMENTASSUME CS:C_SEG,SS:S_SEGMOV AX,S_SEGMOV SS,AXMOV SP,OFFSET TOSPUSH DSMOV AX,0PUSH AX...PUSH T_ADDRPUSH AXPUSHF...POPFPOP AXPOP T_ADDRRETC_SEG ENDS ;END OF CODE SEGMENTEND C_SEG ;END OF ASSEMBLY4.分析下面"6.4题的程序"的功能,写出堆栈最满时各单元的地址及内容. ; 6.4题的程序;====================================STACK SEGMENT AT 500HDW 128 DUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMENT ;DEFINE CODE SEGMENTMAIN PROC FAR ;MAIN PART OF PROGRAMASSUME CS:CODE,SS:STACKSTART: ;STARTING EXECUTION ADDRESSMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOSPUSH DSSUB AX,AXPUSH AX;MAIN PART OF PROGRAM GOES HEREMOV AX,4321HCALL HTOARET ;RETURN TO DOSMAIN ENDP ;END OF MAIN PART OF PROGRAM HTOA PROC NEAR ;DEFINE SUBPROCEDURE HTOA CMP AX,15JLE B1PUSH AXPUSH BPMOV BP,SPMOV BX,[BP+2]AND BX,000FHMOV [BP+2],BXPOP BPMOV CL,4SHR AX,CLCALL HTOAPOP AXB1:ADD AL,30HCMP AL,3AHJL PRINTITADD AL,07HPRINTIT:MOV DL,ALMOV AH,2INT 21HRETHTOA ENDP ;END OF SUBPROCEDURECODE ENDS ;END OF CODE SEGMENTEND START ;END OF ASSEMBLY5.下面是6.5题的程序清单,请在清单中填入此程序执行过程中的堆栈变化. 0000 STACKSG SEGMENT0000 20 [. DW 32 DUP(?)????0040 ]STACKSG ENDS0000 CODESG SEGMENT PARA 'CODE'0000 BEGIN PROC FARASSUME CS:CODESG,SS:STACKSG0000 1E PUSH DS0001 2B C0 SUB AX,AX0003 50 PUSH AX0004 E8 0008 R CALL P100007 CB RET0008 BEGIN ENDP0008 B10 PROC0008 E8 000C R CALL C10000B C3 RET000C B10 ENDP000C C10 PROC000C C3 RET000D C10 ENDP000D CODESG ENDSEND BEGIN6.写一段子程序SKIPLINES,完成输出空行的功能.空行的行数在AX寄存器中. [解]:SKIPLINES PROC NEARPUSH CXPUSH DXMOV CX,AXNEXT: MOV AH,2MOV DL,0AHINT 21HMOV AH,2MOV DL,0DHINT 21HLOOP NEXTPOP DXPOP CXRETSKIPLINES ENDP7.设有10个学生的成绩分别是76,69,81,90,73,88,99,63,100和80分.试编制一个子程序统计60-69,70-79,80-89,90-99和100分的人数并分别存放到S6,S7,S8,S9和S10单元中.DSEG SEGMENTNUM DW 76,69,84,90,73,88,99,63,100,80N DW 10S6 DW 0S7 DW 0S8 DW 0S9 DW 0S10 DW 0DSEG ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE, DS:DSEGSTART:PUSH DSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AXCALL SUB1RETMAIN ENDPSUB1 PROC NEARPUSH AXPUSH BXPUSH CXPUSH SIMOV SI, 0MOV CX, NNEXT:MOV AX, NUM[SI]MOV BX, 10DIV BLMOV BL, ALCBWSUB BX, 6SAL BX, 1INC S6[BX]ADD SI,2LOOP NEXTPOP SIPOP CXPOP BXPOP AXRETSUB1 ENDPCODE ENDSEND START(解法二)datasg segmentgrade db 76,69,84,90,73,88,99,63,100,80 s6 db 0s7 db 0s8 db 0s9 db 0s10 db 0mess6 db '60~69:$'mess7 db '70~79:$'mess8 db '80~89:$'mess9 db '90~99:$'mess10 db '100:$'datasg endscodesg segmentmain proc farassume cs:codesg,ds:datasgstart:push dssub ax,axpush axmov ax,datasgmov ds,axcall sub1lea dx,mess6call dispstrmov dl,s6call dispscorecall crlflea dx,mess7call dispstrmov dl,s7call dispscorecall crlflea dx,mess8call dispstrmov dl,s8call dispscorecall crlflea dx,mess9call dispstrmov dl,s9call dispscorecall crlflea dx,mess10call dispstrmov dl,s10call dispscore call crlfretmain endpsub1 proc nearmov cx,10mov si,0loop1: mov al,grade[si]cmp al,60jl next5cmp al,70jge next1inc s6jmp short next5 next1: cmp al,80jge next2inc s7jmp short next5 next2: cmp al,90jge next3inc s8jmp short next5 next3: cmp al,100jg next5je next4inc s9jmp short next5next4: inc s10next5: inc siloop loop1retsub1 endpdispstr proc nearmov ah,9int 21hdispstr endpdispscore proc nearadd dl,30hmov ah,2int 21hdispscore endpcrlf proc nearmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hretcrlf endpcodesg endsend start8.编写一个有主程序和子程序结构的程序模块.子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR.要求在N字节数组中查找字符CHAR,并记录该字符的出现次数.;主程序则要求从键盘接收一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数.(为简化起见,假设出现次数<=15,可以用十六进制形式显示出来)[解]:DATA SEGMENTMAXLEN DB 40N DB ?TABLE DB 40 DUP (?)CHAR DB 'A' ; 查找字符'A'EVEN_ADDR DW 3 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATAMAIN PROC FARSTART:PUSH DSMOV AX, 0PUSH AXMOV AX, DATAMOV DS, AXLEA DX, MAXLENMOV AH, 0AHINT 21H ; 从键盘接收字符串MOV _ADDR, OFFSET TABLEMOV _ADDR+2, OFFSET NMOV _ADDR+4, OFFSET CHARMOV BX, OFFSET _ADDR ; 通过地址表传送变量地址CALL COUNT ; 计算CHAR的出现次数CALL DISPLAY ; 显示RETMAIN ENDPCOUNT PROC NEAR ; COUNT子程序PUSH SIPUSH DIPUSH AXPUSH CXMOV DI, [BX]MOV SI, [BX+2]MOV CL, BYTE PTR[SI]MOV CH, 0MOV SI, [BX+4]MOV AL, BYTE PTR[SI]MOV BX, 0AGAIN:CMP AL, BYTE PTR[DI]JNE L1INC BXL1: INC DILOOP AGAINPOP CXPOP AXPOP DIPOP SIRETCOUNT ENDPDISPLAY PROC NEAR ; DISPLAY子程序CALL CRLF ; 显示回车和换行MOV DL, CHARMOV AH, 2INT 21HMOV DL, 20HMOV AH, 2INT 21HMOV AL, BLAND AL, 0FHADD AL, 30HCMP AL, 3AHJL PRINTADD AL, 7PRINT:MOV DL, ALINT 21HCALL CRLFRETDISPLAY ENDPCRLF PROC NEAR ; CRLF子程序MOV DL, 0DHMOV AH, 2INT 21HMOV DL, 0AHMOV AH, 2INT 21HRETCRLF ENDPCODE ENDSEND START9.编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来.主程序TELIST:(1)显示提示符INPUT NAME:;(2)调用子程序INPUT_NAME输入姓名:(3)显示提示符INPUT A TELEPHONE NUMBER:;(4)调用子程序INPHONE输入电话号码;(5)调用子程序PRINTLINE显示姓名及电话号码;子程序INPUT_NAME:(1)调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中;(2)把INBUF中的姓名移入输出行OUTNAME;子程序INPHONE:(1)调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中;(2)把INBUF中的号码移入输出行OUTPHONE.子程序PRINTLINE:显示姓名及电话号码,格式为:NAME TEL**** ********==========================================;编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来(解法一)data segmentNo_of_name db 20No_of_phone db 8inbuf db 20 dup(?)outname db 20 dup(?),'$'outphone db 8 dup(?),'$'message1 db 'please input name:','$'message2 db 'please input a telephone number:','$'message3 db 'NAME',16 dup(20h),'TEL.',13,10,'$'errormessage1 db 'you should input 8 numbers!',13,10,'$'errormessage2 db 'you input a wrong number!',13,10,'$'flag db ?data endsprog segmentmain proc farassume cs:prog,ds:datastart:push dssub ax,axpush axmov ax,datamov ds,axmov flag,0lea dx,message1mov ah,09int 21hcall input_namecall crlflea dx,message2mov ah,09int 21hcall inphonecall crlfcmp flag,1je exitcall printline exit:retmain endpinput_name proc nearpush axpush dxpush cxmov cx,0mov cl,No_of_name call getcharmov ax,0mov al,No_of_name sub ax,cxmov cx,axmov si,0next1:mov al,inbuf[si] mov outname[si],al inc siloop next1pop cxpop dxpop axretinput_name endpinphone proc nearpush axpush dxmov cx,0mov cl,No_of_phonecall getcharcmp cx,0jnz error1mov cl,No_of_phone mov si,0next2:mov al,inbuf[si]cmp al,30hjl error2cmp al,39hja error2mov outphone[si],al inc siloop next2jmp exit2error1:call crlflea dx,errormessage1 mov ah,09int 21hmov flag,1jmp exit2error2:call crlflea dx,errormessage2 mov ah,09int 21hmov flag,1jmp exit2exit2:pop dxpop axretinphone endpgetchar proc nearpush axpush dxmov di,0rotate:mov ah,01int 21hcmp al,0dhje exit1mov inbuf[di],al inc diloop rotateexit1:pop dxpop axretgetchar endpcrlf proc nearpush axpush dxmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hpop dxpop axretcrlf endpprintline proc nearpush axpush dxlea dx,message3mov ah,09int 21hlea dx,outnamemov ah,09int 21hlea dx,outphonemov ah,09int 21hpop dxpop axretprintline endpprog endsend main==========================================;从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来datarea segmentinbuf label byte ;name parameter list: maxnlen db 9 ;max.lengthnamelen db ? ;no. char entered namefld db 9 dup(?)crlf db 13,10,'$'messg1 db 'INPUT NAME:',13,10,'$'messg2 db 'INPUT A TELEPHONE NUMBER:',13,10,'$'messg3 db 'NAME TEL',13,10,'$'OUTNAME db 21 dup(?),'$'OUTPHONE db 8 dup(?),'$'datarea endsprognam segmentassume cs:prognam,ds:datareastart: push dssub ax,axpush axmov ax,datareamov ds,axmov es,axTELIST proc farmov ah,09lea dx,messg1int 21hcall INPUT_NAMEmov ah,09lea dx,messg2int 21hcall INPHONEcall PRINTLINEretTELIST endpINPUT_NAME proc nearcall GETCHARmov bh,0mov bl,namelenmov cx,21sub cx,bxb20: mov namefld[bx],20hinc bxloop b20lea si,namefld lea di,OUTNAMEmov cx,9cldrep movsbretINPUT_NAME endpINPHONE proc nearcall GETCHARmov bh,0mov bl,namelenmov cx,9sub cx,bxb30: mov namefld [bx],20hinc bxloop b30lea si,namefldlea di,OUTPHONEmov cx,8cldrep movsbretINPHONE endpPRINTLINE proc nearmov ah,09hlea dx,messg3int 21hmov ah,09lea dx,OUTNAMEint 21hmov ah,09lea dx,OUTPHONEint 21hretPRINTLINE endpGETCHAR proc nearmov ah,0ahlea dx,inbufint 21hmov ah,09lea dx,crlfint 21hretGETCHAR endpprognam endsend start==========================================10.编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来.主程序BANDO:把整数字变量VAL1存入堆栈,并调用子程序PAIRS;子程序PAIRS:从堆栈中取出VAL1;调用二进制显示程序OUTBIN显示出与其等效的二进制数;输出8个空格;调用八进制显示程序OUTOCT显示出与其等效的八进制数;调用输出回车及换行符的子程序..model small.stack 100h.dataval1 dw 0ffffh.codemain proc farstart:push dssub ax,axpush axmov ax,@datamov ds,axpush val1call pairsretmain endppairs proc near push bpmov bp,spmov bx,[bp+4] call outbinmov cx,8loop1:mov dl,20h mov ah,2int 21hloop loop1call outoctcall crlfpop bpret 2pairs endp outbin proc near mov cx,16loop2:mov dl,0rol bx,1rcl dl,1or dl,30h mov ah,2int 21hloop loop2retoutbin endp outoct proc near mov dl,0rol bx,1rcl dl,1add dl,30h mov ah,2int 21hmov ch,5mov cl,3loop3:rol bx,clmov al,bland al,07hadd al,30hmov dl,almov ah,2int 21hdec chjnz loop3retoutoct endpcrlf proc nearmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretcrlf endpend start11.假定一个名为MAINPRO的程序要调用子程序SUBPRO,试问:(1)MAINPRO中的什么指令告诉汇编程序SUBPRO是在外部定义的?(2)SUBPRO怎么知道MAINPRO要调用它?[解]:(1)EXTRN SUBPRO: FAR(2)PUBLIC SUBPRO12.假定程序MAINPRO和SUBPRO不在同一模块中,MAINPRO中定义字节变量QTY 和字变量VALUE和PRICE.SUBPRO程序要把VALUE除以QTY,并把商存在PRICE中,试问:(1)MAINPRO怎么告诉汇编程序外部子程序要调用这三个变量?(2)SUBPRO怎么告诉汇编程序这三个变量是在另一个汇编语言程序中定义的? [解]:(1)PUCLIC QTY,VALUE,PRICE(2)EXTRN QTY: BYTE, VALUE: WORD, PRICE: WORD13.假设:(1)在模块1中定义了双字变量VAR1,首地址为VAR2的字节数组和NEAR标号LAB1,它们将由模块2和模块3所使用;(2)在模块2中定义了字变量VAR3和FAR标号LAB2,而模块1中要用到VAR3,模块3中要用到LAB2;(3)在模块3中定义了FAR标号LAB3,而模块2中要用到它.试对每个源模块给出必要的EXTRN和PUBLIC说明.;模块1extrn var3:wordpublic var1,var2,lab1data1 segmentvar1 dd ?var2 db 10 dup(?)data1 endscode1 segmentassume cs:code1, ds:data1main proc farmov ax,data1mov ds,ax...lab1:...mov ax,4c00hint 21hmain endpcode1 endsend start;模块2extrn var1:dword,var2:byte,lab1:near,lab3:far public var3,lab2data2 segmentvar3 dw ?data2 endscode2 segmentassume cs:code2, ds:data2...lab2:...code2 endsend;模块3extrn var1:dword,var2:byte,lab1:near,lab2:far public lab3code3 segmentassume cs:code3...lab3:...code3 endsend14.主程序CALLMUL定义堆栈段,数据段和代码段,并把段寄存器初始化;数据段中定义变量QTY和PRICE;代码段中将PRICE装入AX,QTY装入BX,然后调用子程序SUBMUL.程序SUBMUL没有定义任何数据,它只简单地把AX中的内容(PRICE)乘以BX中的内容(QTY),乘积放在DX,AX中.请编制这两个要连接起来的程序. datasg segmentqty dw 2price dw 4datasg endsstacksg segmentdw 100 dup(?)tos label wordstacksg endscodesg segmentmain proc farassume cs:codesg,ds:datasg,ss:stacksgstart:mov ax,datasgmov ds,axmov ax,stacksgmov ss,axmov sp,offset tosmov ax,pricemov bx,qtycall submulmov ax,4c00hint 21hmain endpsubmul proc nearmov dx,0mul bxretsubmul endpcodesg endsend start15.试编写一个执行以下计算的子程序COMPUTE:R<-X+Y-3其中X,Y及R均为字数组.假设COMPUTE与其调用程序都在同一代码段中,数据段D_SEG中包含X和Y数组,数据段E_SEG中包含R数组,同时写出主程序调用COMPUTE过程的部分.如果主程序和COMPUTE在同一程序模块中,但不在同一代码段中,程序就如何修改?如果主程序和COMPUTE不在同一程序模块中,程序就如何修改?(1)d_seg segmentx dw 1y dw 4d_seg endse_seg segmentr dw ?e_seg endsc_seg segmentmain proc farassume cs:c_seg,ds:d_seg,es:e_segstart:mov ax,d_segmov ds,axmov ax,e_segmov es,axcall computemov ax,4c00hint 21hmain endpcompute proc nearmov ax,xadd ax,ysub ax,3mov es:r,axretcompute endpc_seg endsend start;========================================(2)d_seg segmentx dw 1y dw 4d_seg endse_seg segmentr dw ?e_seg endsc_seg segmentmain proc farassume cs:c_seg,ds:d_seg,es:e_segstart:mov ax,d_segmov ds,axmov ax,e_segmov es,axcall far ptr computemov ax,4c00hint 21hmain endpc_seg endsprognam segmentassume cs:prognamcompute proc farmov ax,xadd ax,ysub ax,3mov es:r,axretcompute endpprognam endsend start;============================================= (3);模块1extrn compute:farpublic x,y,rd_seg segmentx dw 1y dw 4d_seg endse_seg segmentr dw ?e_seg endsc_seg segmentmain proc farassume cs:c_seg,ds:d_seg,es:e_segstart:mov ax,d_segmov ds,axmov ax,e_segmov es,axcall far ptr computemov ax,4c00hint 21hmain endpc_seg endsend start;模块2extrn x:word,y:word,r:word public computeprognam segmentassume cs:prognamcompute proc farmov ax,xadd ax,ysub ax,3mov es:r,axretcompute endpprognam endsend。
汇编语言第6章

外设
内存
CPU
DMA控制器
4.中断传送 在查询传送方式中,CPU与外设串行工作,外设在进行I/O操作时,CPU并未进行其它的工作而是处于长时间反复查询的等待状态。为提高CPU的效率,采用中断方式,中断的特点是CPU与外设并行工作,即CPU启动外设之后,不再等待外设工作的完成,而是执行另一个程序。输入时,当外设就绪,主动向CPU发出中断请求,让CPU为其服务,CPU接到请求后,暂时中断现行程序的运行,转去执行处理相应的中断服务程序,完成所需的数据输入,当处理结束后,CPU又返回到被中断程序的断点处继续往下执行原来中断了的程序;在输出时,当外设空闲时,向CPU发出中断请求,CPU暂停当前程序的执行,转去执行相应中断服务程序,完成所需的数据输出,然后再返回去执行原来中断了的程序。这种方式避免了CPU反复查询外设的状态而浪费时间,节省大量的CPU时间,又可以使多台外围设备与CPU并行工作。
三、I/O的传送方式
外设与CPU之间进行数据、状态和控制三种信息传送,这些信息以四种方式进行传送。 1.无条件传送 当外设的数据传送是定时的,即外设与CPU同步的情况下,CPU不需要查询外设的状态,而直接用IN或OUT指令实现CPU与指定的外设寄存器之间的信息传送。如当输入信息是开关量时,开关已设定,只要用输入指令,肯定会读入开关的状态。无条件传送是最简单的数据传送方式,它所需要的硬件和软件都是最节省的,但这种方式必须在已知并确信外设已处于准备就绪的情况下才能使用,否则就会出错。
汇编语言与接口技术 习题解答

习题一解答:1.3(1)[0.0000]原=0.0000 [0.0000]反=0.0000 [0.0000]补=0.0000(2)[0.1001]原=0.1001 [0.1001]反=0.1001 [0.1001]补=0.1001(3)[-1001]原=11001 [-1001]反=10110 [-1001]补=101111.4[N]反=1.0101 [N]原=1.1010 [N]补=1.0110 N=-0.10101.5(1)原码运算:比较可知,正数较大,用正数减负数,结果为正反码运算:01010011-00110011=[01010011]反+[-00110011]反=001010011+[100110011]反=001010011+111001100=000100000补码运算:01010011-00110011=[01010011]补+[-00110011]补=001010011+[100110011]补=001010011+111001101=000100000(2)原码运算:比较可知,负数较大,用负数减正数,结果为负反码运算:0.100100-0.110010=0.100100+[1.110010]反=0.100100+1.001101=1.110001补码运算:0.100100-0.110010=0.100100+[1.110010]补=0.100100+1.001110=1.1100101.6(1) (11011011)2=(219)10=(001000011001)BCD(2) (456)10=(010*********)BCD(3) (174)8=(124)10=(000100100100)BCD(4) (2DA)16=(730)10=(011100110000)BCD1.7(1)9876H看成有符号数时,默认为负数的补码,转换为十进制数是:-26506(2)9876H看成无符号数时,转换为十进制数是:390301.8(1)98的压缩BCD码为:10011000B(2)98的非压缩BCD码为:0000100100001000B1.9(1)[S1+S2]补=[S1]补+[S2]补=00010110+00100001=00110111,无溢出[S1-S2]补=[S1]补+[-S2]补=00010110+11011111=11110101,无溢出(2)[S1+S2]补=[S1]补+[S2]补=00010110+11011111=11110101,无溢出[S1-S2]补=[S1]补+[-S2]补=00010110+00100001=00110111,无溢出(3)[S1+S2]补=[S1]补+[S2]补=01100100+00011110=10000010,有溢出[S1-S2]补=[S1]补+[-S2]补=01100100+11100010=01000110,无溢出(4)[S1+S2]补=[S1]补+[S2]补=10011100+11100010=01111110,有溢出[S1-S2]补=[S1]补+[-S2]补=10011100+00011110=10111010,无溢出习题二解答:2.1答:8086有哪些寄存器组?各有什么用途?①通用寄存器AX、BX、CX、DX它既可用作16位寄存器,又可将它拆成高、低8位,分别作为两个独立的8位寄存器使用。
第6章练习与作业 ppt课件

练习2 15
10 9
87
0
OP(6位) M(2位) A(8位)
(3)指令码为 1322H 将指令码展开:000100 11 00100010B M=11 ,相对寻址 有效地址EA=(PC)+A=1234H+22H=1256H
(4)指令码为 3521H 将指令码展开:001101 01 00100001B M=01 ,用变址寄存器X1进行变址 有效地址EA=(X1)+ A=0037H+21H=0058H
指令格式 指令字长为32位,OP需6位、MOD需3位、i需4位 A的位数=32-6-3-4=19位 指令格式如下
31
26 25
23 22
19 18
0
OP(6位) MOD(3位) REG(4位) A(19位)
(2)若采用通用寄存器作基址寄存器,则“寄存器-存储器” 型指令的格式是怎样的?能寻址的最大存储空间是多少?
解:因为26=64,所以定义60种操作,操作码字段需要6位
共有8种寻址方式, 23=8,所以MOD字段需要3位
共有16个通用寄存器,24=16,所以在指令中需要4位编码选择 寄存器
采用寄存器间接寻址时,寄存器存放操作数的地址,EA= (Ri),寄存器为32位,操作数地址即为32位,所以寻址最大 空间为:232B 采用直接寻址,地址码字段的形式地址就是有效地址, EA=A,为19位,所以寻址最大空间为:219B
23 22
0
OP(7位) M(2位) A(23位)
作业1(6.10) 某机型16位字长指令格式如下:
OP
M
D
5位
3位
8位
其中,D是形式地址,采用补码表示(包括一位符号);M是寻找方式
汇编语言课后答案第6章

第6章习题6.1 主程序与子程序之间进行参数传递有哪几种方法?简单说明并比较。
6.2 编写一个子程序,把16位二进制数转换为5位十进制数ASCII码。
6.3 编写一个把16位二进制数转换为4位十六进制数ASCII码的子程序6.4 编写一个计算字符串长度的子程序,字符串以0为结尾标志。
入口参数:字符串的首地址指针为DS:SI;出口参数:在AX中返回字符串的长度。
6.5 编写程序,将字符串STING1的内容复制到字符串STRING2中。
要求由子程序来实现字符串的复制,并采用寄存器来传递参数。
6.6 用通过存储单元传递参数的方法完成上题。
6.7 用通过堆栈传递参数的方法完成上题。
6.8 设计程序,从键盘接收一个字符串,显示字符串的长度,要求计算长度的工作由子程序来实现。
6.9 编程计算三个变量的绝对值之和,求绝对值采用子程序结构以简化程序。
6.10 编写程序完成运算X=A*B+C(设各数及结果都不超过65536),A、B、C为从键盘输入的十进制数,要求从键盘接收十进制数并转换为二进制的工作由子程序来完成。
6.11 编写程序,将内存缓冲区BUFFER1中的10个压缩型BCD码数转换成非压缩的BCD码,保存到缓冲区BUFFER2中。
要求转换工作由子程序来完成。
6.12 从键盘输入一组字符,直到按ESC键为止,存储在内存缓冲区BUFFER中。
要求用子程序来实现当输入字符为a~z时,则修改为A~Z。
6.13 阅读下面子程序,说明它完成的功能是什么?子程序的入口参数和出口参数各是什么?SUM16 PROC NEARMOV AX,0MOV DX,0LOP:ADD AX,[BX]ADC DX,0ADD BX,2LOOP LOPRETSUM16 ENDP完成N个数(字)的累加。
入口参数:CX=N,BX=N个数的首地址。
出口参数:累加和,DX:AX。
6.14 编写子程序,把用ASCII码表示的两位十进制数转换为对应的二进制数。
汇编语言与接口技术课后答案(1-8章完整版)-王让定 朱莹编( 下载后可查看剩余几章内容)

第一章(下载后可查看)第二章1.8086/8088 CPU的地址总线有多少位?其寻址范围是多少?答:8086/8088 CPU的地址总线共20位,最大可寻址1MB空间。
2.8086/8088 CPU分为哪两个部分?各部分主要由什么组成?答:8086/8088 CPU分为总线接口部件(BIU)和执行部件(EU)两个部分。
其中: BIU包括:4个16位的段地址寄存器(CS、DS、SS、ES);1个16位的指令指针寄存器IP;1个20位的地址加法器;指令队列寄存器;内部寄存器;输入输出总线控制逻辑;EU包括:4个16位的通用数据寄存器(AX、BX、CX、DX);4个16位的专用寄存器(BP、SP、SI、DI);1个16位的标志寄存器FR;4. 8086/8088 CPU中有几个通用寄存器?有几个变址寄存器?有几个指针寄存器?通常哪几个寄存器亦可作为地址寄存器使用?答:8086/8088 CPU中共有:8个16位的通用寄存器AX、BX、CX、DX 、BP、SP、SI、DI;2个变址寄存器SI、DI;2个指针寄存器BP、SP;其中BX、BP、SI、DI亦可作地址寄存器。
5.8086/8088 CPU中有哪些标志位?它们的含义和作用如何?答:8086/8088 CPU中共有9个标志位,其中DF、IF和TF为控制标志位,其余6个为状态标志位。
它们的含义和作用如下所示:CF(Carry Flag)进位标志:若算术运算的结果产生了进位或借位(对字节操作最高位是D7位;对字操作最高位是D15位),则CF=1,否则CF=0。
PF(Parity/Even Flag)奇偶标志:如果运算结果中含有偶数个1,则PF=1,否则PF=0。
此标志位主要用于数据通信中,检测数据传送有无出错。
AF(Auxiliary Carry Flag)辅助进位标志:用于反映一个字节(字的低字节)的低4位向高4位有无进位(借位)的情况,有进(借)位时,AF=1,否则AF=0。
微机原理及接口第六章作业答案

“微机系统原理与接口技术”第六章习题解答(部分)3.统一编址和分离编址,统一编址:存储器和I/O地址空间统一分配,用相同的指令访问存储器和I/O中的内容,访问存储器和I/O时,用相同的控制信号和不同的地址信号;分离编址:存储器和I/O地址空间单独分配,用不同的指令访问存储器和I/O,访问存储器和I/O时,地址可以相同,但有不同的控制信号。
4.某微机系统有8个I/O接口芯片,每个接口芯片占用8个端口地址。
若起始地址为9000H,8个接口芯片的地址连续分布,用74LS138作译码器,请画出端口译码电路图,并说明每个芯片的端口地址范围。
答:分析下表所列的地址分配情况,可知系统地址信号的译码情况为(图略):●字选:A2~A0直接与接口芯片上的地址信号线连接以寻址每个接口芯片内部的8个端口;●片选:⏹A5~A3接3-8译码器输入端,译码器输出端分别作为8个接口芯片的片选信号;6(略)7、中断、DMA8. 假设一台打印机的数据输出I/O口地址为378H,状态口地址为379H,状态字节的D0位为状态位(D0=0,表示打印数据缓冲区空,CPU可以向它输出新数据;D0=1,表示数据区满)。
试编写一段程序,用查询方式从内存中以BUF为首址的单元处开始,将连续1KB的数据传送给打印机,每次送1字节。
答:一种可能的程序段如下实现:……LEA BX, BUF ; BX指向第1个待打印的数据MOV CX, 1024 ; 一共要送1K个字节数据NEXT: MOV DX, 379HIN AL, DX ; 读打印机状态端口TEST AL, 01HJNZ NEXT ; 若D0位不为0,则继续查询等待MOV DX, 378HMOV AL, [BX]OUT DX,AL ; 将BX所指的数据发送到打印机INC BX ; BX指向下一个待打印的字节LOOP NEXT ; CX不为0,继续送下一个字节……9. 请用无条件传输方式编写一个完整的输入/输出程序,将首地址为40000H的内存单元中的1K个字数据从端口Output处输出,然后从端口Input处输入2KB数据到首地址为50000H的内存单元中(端口地址的实际值可自行给定)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P327页
15.8255A有哪几种工作方式,对这些工作方式有什么规定?
答:8255A有三种工作方式。
分别是方式0(基本的输入输出方式);方式1(选通的输入输出方式);方式2(双向传输方式)。
方式0:不需要应答联络信号。
A、B、C口都可以工作在方式0。
方式1:选通的输入输出方式,只有A、B端口可以工作在方式1,C端口作为A、B端口的应答信号。
而且是单向的,作为输入端口,就不能做输出端口,作为输出端口就不能做输入端口。
方式2:双向传输方式,只有A端口可以工作在方式2,C端口做为A端口输入输出时的应答信号,可以工作在输入,也可以工作在输出。
16.假设8255A端口地址为00C0~00C6H,要求:
(1)对8255A设置工作方式,A端口工作在方式1,输入;B端口工作在方式0,输出;端口C的4为配合端口A工作,端口C的低4为方式0,输入。
(2)用置0∕置1,直接对PC6置1,对PC4置0
答:端口地址0000 0000 1100 0000 ~0000 0000 1100 0110。
说明A口地址为00C0H,B 口地址为00C2H,C口地址为00C4H,控制字地址为00C6H。
(1)控制字为:1011X001B,即0B1H(X取0)
MOV AL,0B1H
MOV DX,00C6H
OUT DX,AL
(2)直接对PC6置1时的控制字为:0XXX1101B,即0DH
MOV AL,0DH
MOV DX,00C6H
OUT DX,AL
直接对PC4置0时的控制字为:0XXX1000B,即08H
MOV AL,08H
MOV DX,00C6H
OUT DX,AL
17.使用8255A作为开关和LED指示灯的接口。
要求8255A的A口连接8个开关,B口连接8个LED(发光二极管),用作指示灯,将A口的开关状态读入,然后送至B口控制指示灯亮、灭。
试画出接口电路设计图,并编写程序实现。
解:根据要求,设计电路如图所示。
用PA7引脚上的开关控制PB7上的LED,PA0引脚上的开关控制PB0上的LED。
开关闭合输入低电平,开关打开输入高电平。
高电平指示灯亮。
A端口地址为8000H,B端口地址为8001H ,C端口地址为8002H ,控制字寄存器地址为8003H(假设未使用的地址线都取0)。
控制字:10010000B(C口工作在输出),即90H
参考程序:
MOV AL, 90H
MOV DX, 8003H
OUT DX, AL
LOOP: MOV DX, 8000H
IN AL, DX
MOV DX, 8001H
OUT DX, AL
JMP LOOP
3.若8253芯片的接口地址为D0D0H~D0D3H,时钟信号为2MHz,现利用计数器0、1、2分别产生周期为10us的方波,每隔1ms和10ms产生一个负脉冲,试画出系统的连线图。
并写出初始化程序。
解:定时器0的计数初值=10×10-6×2×106=20,工作在方式3。
控制字:00010111(17H)定时器1的计数初值=1×10-3×2×106=2000,工作在方式2。
控制字:01110101(75H)定时器2的计数初值=10×10-3×2×106=20000=4E20H,工作在方式2。
控制字:10110100(B4H)。
初始化程序:
MOV AL,17H
MOV DX, 0D0D3H
OUT DX, AL
MOV AL,20
MOV DX, 0D0D0H
OUT DX, AL
MOV AL,75H
MOV DX, 0D0D3H
OUT DX, AL
MOV AX,00H
MOV DX, 0D0D1H
OUT DX, AL ;先送计数值低位
MOV AL,20H
OUT DX, AL ;再送计数值高位
MOV AL,0B4H
MOV DX, 0D0D3H
OUT DX, AL
MOV AX,4E20H
MOV DX, 0D0D2H OUT DX, AL ;先送计数值低位 MOV AL,AH OUT DX, AL ;再送计数值高位
4.某计算机系统采用8253的计数0作为频率发生器,输出频率500Hz ,利用计数器1产生1000Hz 的方波,输入的时钟频率为1.19MHz 。
请问计数器0和计数器1工作在什么方式下?计数初值分别是多少?
解:计数器0工作方式2,计数器1工作方式3下。
计数0初值=1.19×106
÷500=2380
计数2初值=1.19×106
÷1000=1190
5.利用8254的通道1,产生500Hz 的方波信号。
设输入时钟的频率CLK1=2.5MHz ,端口地址为FFA0H~FFA3H ,试编制初始化程序。
解:计数器1工作方式3下。
计数1初值=2.5×106
÷500=5000 控制字:01110111(77H ) 初始化程序:
MOV AL,77H
MOV DX, 0FFA3H OUT DX, AL MOV AL,00H
MOV DX, 0FFA1H OUT DX, AL ;先送计数值低位 MOV AL,50H
OUT DX, AL ;再送计数值高位
0 0 0 1 1 1
2 2 2
6.某系统使用5254的通道0作为计数器,计满1000,向CPU发中断请求,试编写初始化程序(端口地址自设)。
解:计数器0工作方式0下。
(假设端口地址为FFA0H~FFA3H)
计数1初值=1000
控制字:00110001(31H)
初始化程序:
MOV AL,31H
MOV DX, 0FFA3H
OUT DX, AL
MOV AL,00H
MOV DX, 0FFA1H
OUT DX, AL ;先送计数值低位
MOV AL,10H
OUT DX, AL ;再送计数值高位。