汇编与接口 第六章作业

合集下载

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

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

《微机原理与接口技术》第六章作业一、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章

汇编语言第6章
3.直接存储器传送(DMA) 直接存储器传送方式适用于高速I/O设备,如磁盘、数模转换器等设备,这些设备传输字节或字的速度非常快,因此用硬件在外设与内存之间直接进行数据交换而不通过CPU。 其传送大致过程是:先用软件把数据在高速外设中存放的起始位置、数据在内存中存放的起始位置、传送数据的个数等参数送到外设相应的寄存器中,然后启动外设,当外设就绪就向CPU发直接传送请求信号,CPU让出总线控制权,高速外设在DMAC的控制下交换数据,数据交换完毕,DMAC交回总线控制权。
外设
内存
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课件

第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章习题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-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.8086的段式存储结构段地址+偏移量地址=存储单元的物理地址或者,段寄存器的值*16+偏移地址=存储单元的物理地址2.段寄存器,通用寄存器,指针与变址寄存器,标志寄存器3.寻址方式(1)寻址方式的概念(2)寻址方式的分类(3)各寻址方式中对于寄存器的限制(4)各类寻址方式的格式第三章汇编语言(参照课件)1.汇编语句格式:[标号] 操作符操作数[;注释] 2.标号的概念以及其三个属性3.伪指令:(1)符号定义伪指令:EQU(2)数据定义伪指令:DB,DW(3)段定义伪指令:SEGMENT、ENDS、ASSUME 4、运算符(1)分析算符:SEG,,OFFSET ,SIZE,LENGTH(2)组合算符:PTR5.指令语句与伪指令语句的区别6.数据段、堆栈段、代码段的用途第四章指令及汇编程序设计1.数据传送指令:MOV、PUSH、POP、XCHG、XLAT2.算数运算指令:ADD、ADC、INC、SUB、SBB、DEC、NEG、3.逻辑运算指令:CMP、TEST、OR、AND、NOT、XOR4.移位指令:逻辑左移/右移,算数左移/右移,循环左移/右移,带进位的循环左移/右移;以及移位指令对于CF、OF标志位的影响分支结构程序设计1.无条件转移指令2.有条件的转移指令(教材P102)3.分支程序编写循环结构程序设计1.循环控制指令LOOP、LOOPE/Z、LOOPNE/NZ以及他们的控制条件(对CF、ZF的判断)2.循环程序编写子程序设计1.子程序定义伪指令、调用指令、返回指令2.子程序设计中对于堆栈操作的要求第五章输入与输出中断1.中断向量表、中断向量的概念2.中断向量的修改3.中断的类型:软件中断、可屏蔽硬件中断、非屏蔽硬件中断;以及CPU队可屏蔽硬件中断和非屏蔽硬件中断的不同的响应条件4.8259的基本结构和工作原理5.8259的操作命令字:包括各个命令字的作用、格式、具体的操作6.软件中断与硬件中断的异同点第六章8254程序设计1.8254的基本结构和工作原理2.8254的命令字格式,以及对于8254各个计数器工作方式的设定8255程序设计1.8255的基本结构和工作原理2.8255的命令字格式,以及对于8255各端口的操作16550异步串行通信中,波特率的概念,数据帧的概念第七章简单外设LED的显示原理键盘的结构及扫描原理一些复习题习题一一、选择题1、8086CPU中程序计数器IP中存放的是。

第六章习题A参考答案

第六章习题A参考答案

第六章习题A参考答案一、填空:1、8086CPU有20条地址引脚。

其最大直接可寻址的内存地址空间是1MB。

其最大直接可寻址的I/O端口地址空间是64K个I/O端口地址。

2、8086CPU有20条地址引脚。

其最大直接可寻址的内存地址空间是1M B。

其最大直接可寻址的I/O端口地址空间是64K个I/O端口地址。

3、8086有40条引脚,其地址引脚有需20条,其数据引脚需有16条,还需有电源、地线等引脚,故引脚不够用,所以采用引脚复用方式。

其引脚复用的方法有两种:分时复用(时间不同,引脚功能不同)和按功能不同复用(工作方式不同,引脚功能不同)。

4、8086引脚复用的方法有两种:分时复用(时间不同,引脚功能不同)和按功能不同复用(工作方式不同,引脚功能不同)。

5、8086引脚复用的方法有两种:分时复用和按功能不同复用。

6、8086有两种工作方式:最小方式和最大方式。

7、8086有两种工作方式:最小方式和最大方式。

8、8086有两种工作方式:最小方式和最大方式。

9、8086的33#引脚MN/MX接+5V电源时,8086工作于最小方式。

10、8086的33#引脚MN/MX接+5V电源时,8086工作于最小方式。

11、8086的33#引脚MN/MX接+5V电源时,8086工作于最小方式。

12、8086的33#引脚MN/MX接地时,8086工作于最大方式。

13、8086的33#引脚MN/MX接地时,8086工作于最大方式。

14、8086的33#引脚MN/MX接地时,8086工作于最大方式。

15、最小方式下的总线控制信号有DT/R、ALE、DEN,它们均由8086CPU直接产生。

16、最大方式下的总线控制信号有DT/R、ALE、DEN。

,它们均由8086CPU直接产生。

17、最小方式下的总线控制信号有DT/R、ALE、DEN,它们均由8086CPU直接产生。

18、最小方式下的总线控制信号有DT/R、ALE、DEN,它们均由8086CPU直接产生。

汇编语言第六章

汇编语言第六章

三.中断向量表
3. 设置或取出中断向量指令 (1) 设置中断向量指令 功能:把由AL指定的中断类型的中断向量DS:DX放入中
断向量表中。
(AH)= 25H
(AL)= 中断类型号
DS:DX = 中断向量 INT 21H
三.中断向量表
(2) 取出中断向量指令
功能:把AL中指定的中断类型的中断向量从中断
一、 WIN32编程基础
(2) 循环控制伪指令
格式:.WHILE 条件表达式 循环体 .ENDW 格式:.REPEAT 循环体 .UNTIL 条件表达式 格式:.CONTINUE 功能:终止本次循环, 开始下一次循环 格式:.BREAK 功能:退出当前循环
功能:实现循环结构
一、 WIN32编程基础
内中断的处理特点: ①中断类型号一般在指令中; ② 不受中断允许标志位IF的影响。
二、 中断源
2. 外中断 由外设控制器、协处理器等CPU以外的事件引起的中断, 称为外中断。 外中断的处理特点: ① 中断类型号由8259A提供,或由自制电路来提供;
② 受中断允许标志位IF的影响(IF=1,响应中断)。
个字节。
三.中断向量表
如:INT 4AH
中断向量地址 = 4AH*4 = 128H
DEBUG执行后, 用D命令查看: ―D0:0↙ … 执行INT 4AH时: IP=1805H CS=F000H IP F000: 1805 中断处理
0:128H
0:129H
05 18
0:12AH
0:12BH
00
F0 …
外设
二、 外设与主机传送的接口与信息
接口的组成:设备状态寄存器、设备控制寄存 器、数据寄存器。 I/O端口的地址空间:允许设置64K个8位端口 或32K个16位端口。 如:40H~43H时钟/定时器,60H~63H为 8255通讯芯片的接口。

微机原理、汇编与接口技术习题答案 第6章习题答案

微机原理、汇编与接口技术习题答案 第6章习题答案

微机原理、汇编与接口技术第六章习题答案6.16.26.36.4stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axCALL I6116 ;调用写入6116子程序MOV AH, 2 ;回车换行MOV DL, 0DHINT 21HMOV DL, 0AHINT 21HCALL O6116 ;调用读出6116子程序retstart endp;写入6116:将键入字符的ASCII码写入6116I6116 PROCMOV BL, 0 ;定义页地址码(16个地址为一页)MOV CX, 128 ;定义页数LOP1: PUSH CXMOV DX, 380H ;将页地址从74LS273输出MOV AL, BLOUT DX, ALMOV CX, 16 ;定义页内单元数MOV DX, 390H ;将键入数写入16个单元LOP2: MOV AH, 1INT 21HOUT DX, ALINC DXLOOP LOP2INC BL ;换页POP CXLOOP LOP1 ;页数未满换页重新写入16个单元RETI6116 ENDP;读出6116:将写入6116的数据读出送显示O6116 PROCMOV BL, 0MOV CX, 128LOP3 PUSH CXMOV DX, 390HMOV AL, BLOUT DX, ALMOV CX, 16MOV DX 380H ;将16个单元的数据送显示LOP4: IN AL, DXPUSH DXMOV DL, AL ;将6116中读出的ASCII码送DLMOV AH, 2 ;2号功能调用显示DL中的字符INT 21HPOP DXINC DXLOOP LOP4INC BLPOP CXLOOP LOP3RETO6116 ENDPcode endsend start6.5stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV AH, 2 ;用2号功能调用输出字符,调用号送AHMOV CX, 100 ;字符个数送计数器MOV DX, 380HWAIT0: IN AL, DX ;从244读入TEST AL, 80H ;测试状态位是否为0JNZ WAIT0 ;不为0,等待继续测试状态WAIT1: IN AL, DX ;状态为0,继续读入TEST AL, 80H ;测试状态是否为1JZ WAIT1 ;不为1,等待继续测试状态IN AL, DX ;状态为1,读入数据即ASCII码AND AL, 7FH ;去掉状态位MOV DL, AL ;ASCII码送DL,输出字符INT 21HLOOP WAIT0-3 ;跳到给DX赋值380H的MOV指令,该指令为3字节retstart endpcode endsend start6.6stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentOBUF DB 4 DUP(0)data endscode segmentbegin proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV BX,0FFSET OBUF+3 ;建立指针MOV BYTE PTR [BX],'$';存字符串结束符$MOV DX,380H ;读入二进制数IN AL,DXMOV CH,10AG: MOV AH,0 ;无符号数扩展为16位DIV CHADD AH,30H ;转换为ASCII码DEC BXMOV [BX],AH ;存入输出数据区中OR AL,ALJNZ AGMOV DX,BXMOV AH,9INT 21Hretbegin endpcode endsend begin6.7用除2取余法将BCD数转换为二进制数的程序如下:stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentIBUF DB 4, 0, 4 dup(0)data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV DX,OFFSET IBUF ;键入十进制数MOV AH,10INT 21HMOV DX,0 ;将键入数以压缩BCD数形式放AX中MOV CH,IBUF+1 ;将键入数的个数送计数器CH中MOV CL,4MOV BX,2AGAIN1: AND IBUF[BX],0FH ;将数据区中的ASCII码转换为BCD数SHL AX,CL ;将BCD数左移1位OR DL,IBUF[BX] ;将数据区中的1位BCD放入DX的最低4位INC BXDEC CHJNZ AGAIN1MOV CX,8 ;用除2取余法将DX中的压缩BCD数转换为二进制数AGAIN2: SHR DX,1RCR AL,1MOV AH,DLAND AH,88HSHR AH,1SHR AH,1SUB DL,AHSHR AH,1SUB DL,AHLOOP AGAIN2MOV DX,380H ;二进制数从74LS273输出OUT DX,ALretstart endpcode endsend start用(百位⨯10+十位)⨯10+个位的方法将BCD数转换为二进制数的程序段如下:MOV CL,IBUF+1 ;将键入数的个数送计数器CX中MOV CH,0MOV SI,2MOV AL, 0 ;开始将十进制数转换为二进制数AGAIN: MOV AH, 10 ;((0×10+a2)×10+…)×10+a0MUL AHAND BYTE PTR [SI], 0FH ;将十进制数的ASCII码转换为BCD数ADD AL,[SI]INC SILOOP AGAIN6.8stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentSEGPT DB 3FH,6,5BH,4FH,66H,7,7FH,6FH,6FH,76H,77H,7CH,39H,5EH,79H,71H data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV DX,380HIN AL,DXSUB AL,30HCMP AL,0AHJB NS7SUB AL,7MOV BL,ALMOV BH,0MOV AL,SEGPT[BX]OUT DX,ALretstart endpcode endsend start6.9stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX, 380HLOP1: IN AL, DX ;读入设备1和设置2的状态AND AL, 6 ;测试2台设备的状态,同时使AL的D0位为0JZ LOP2 ;都正常,即AL的D1位和D2位都为0,AL为0MOV AL, 1 ;有一台异常AL不为0,AL置1,即AL的D0位为1 LOP2: OUT DX, ALMOV AH, 11 ;11号功能调用,键入任一键退出程序INT 21HCMP AL, 0 ;无键入AL=0,有键入AL=FFHJE LOP1 ;无键入,去LOP1继续监视2台设备retstart endpcode endsend start6.10stack segment stack 'stack'dw 32 dup(0)stack endscode segmentbegin proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX, 380HIN AL, DX ;读入原码TEST AL, 80H ;判原码数的符号JZ NONEG ;正数的原码和补码相同,不用求补AND AL, 7FH ;负数,求其绝对值NEG AL ;对绝对值求补得该负数的补码NONEG: OUT DX, ALretbegin endpcode endsend begin6.11在显示器上显示:行*列的程序如下:stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX, 380H ;检测全键盘MOV AL, 0 ;键盘的8行全为低电平OUT DX, ALLOP1: IN AL, DX ;读入列值CMP AL, 0FFH ;列值是FFH吗?JE LOP1 ;是,全键盘无键闭合,继续检测MOV AH, 7FH ;键盘的行检测的输出值,被检测行为0,其余行为1 LOP2: MOV AL, AH ;检测键盘的一行OUT DX, AL ;输出行检测值IN AL, DX ;读入列值,列值不为FFH有键闭合CMP AL, 0FFH ;被检测行有键闭合吗?JNE LOP3 ;有键闭合,结束逐行扫描去LOP3ROR AH, 1 ;该行无键闭合,改变行检测的输出值检测另一行JMP LOP2LOP3: MOV DL, 0 ;求行值0~7,即AH中的那个0的位置AS1: SHR AH ,1 ;0在最低位DL=0,……,0在最高位DL=7JNC AS2JMP AS1AS2: ADD DL, 30H ;将行值转换为ASCII码MOV AH, 2 ;输出行值INT 21HMOV DL, '*';输出乘号:*INT 21HMOV DL, 0 ;求列值0~7,即AL中的那个0的位置AS3: SHR AL, 1JNC AS4INC DLJMP AS3AS4: ADD DL, 30H ;将列值转换为ASCII码INT 21H ;输出列值retstart endpcode endsend start6.12stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentSEGPT DB 77H,7CH,39H,5EH,79H,71H,6FH,76Hdata endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax, axMOV DX, 380HLOP: IN AL, DXMOV BX,0LOP1: SHR AL,1JNC LOP2INC BLJMP LOP1LOP2: MOV AL,SEGPT[BX]OUT DX, ALMOV AH,11INT 21HCMP AL,0JE LOPretstart endpcode endsend start6.13stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX 260HIN AL, DXMOV AH, ALINC DXCMP AL, AHJNC NXCHGXCHG AL, AHNXCHG: SUB AL, AHDASINC DXINC DXOUT DX, ALretstart endpcode endsend start6.14stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV BL, 240MOV DX, 260HLOP: ADD BL, 16MOV AL, BLOUT DX, ALLOOP $ ;延时MOV AH, 11INT 21HCMP AL, 0JE LOPretstart endpend start6.15输出周期性的方波、锯齿波、三角波、正弦波的程序如下:stack segment stack 'stack'dw 32 dup (0)stack endsdata segmentOBF DB 80H, …, 0FFH, …, 80H, …, 00H, …;正弦波的数据(一周期)N EQU $ -OBFdata endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax, axpush axmov ax, datamov ds, axMOV DX, 380HAGAIN: MOV AH, 1 ;键入一字符,应为大写!INT 21HCMP AL, 'F'JE FBCMP AL, 'J'JE JCBCMP AL, 'S'JE SJBCMP AL, 'Z'JE ZXB ;按下F、J、B和Zret ;4个键以外的键退出该程序FB: MOV AL, 0 ;方波输出OUT DX, ALCALL DELAY1CALL DELAY1MOV AH, 11INT 21HCMP AL, 0JE FBJMP AGAINJCB: INC AL ;锯齿波输出OUT DX, ALCALL DELAY2MOV BL, AL ;保护ALMOV AH, 11CMP AL, 0MOV AL, BL ;恢复ALJE JCBJMP AGAINSJB: INC AL ;三角波输出OUT DX, ALCALL DELAY3CMP AL, -1JNE SJBSJB1: DEC ALOUT DX, ALCALL DELAY3CMP AL, 0JNE SJB1MOV AH, 11INT 21HCMP AL, 0JE SJBJMP AGAINZXB: MOV BX, OFFSET OFB ;正弦波输出MOV CX, NZXB1: MOV AL, [BX]OUT DX, ALCALL DELAY4INC BXLOOP ZXB1MOV AH, 11INT 21HCMP AL, 0JE ZXBJMP AGAINstart endpDELAY1: PROCDL11: MOV SI, 0DL12: DEC SIJNZ DL12LOOP DL11POP CXRETDELAY1 ENDPDELAY2 ;延时程序结构一样DELAY3 ;仅CX取值不同;故略DELAY4code endsend start6.1stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax,axpush axmov ax,datamov ds,axMOV CL,4LOP1: MOV AX,0LOP2: PUSH AXMOV DX, 381HROR AX,CL ;高8位数据移入ALOUT DX, ALMOV DX, 380HMOV AL,AH ;低4位数据移入AL的低4位SHR AL,CLOUT DX, AL ;再写一遍MOV AH,11 ;检查键盘有无键入INT 21HCMP AL,0JNE BAK ;键盘有键入,退出POP AXINC AXCMP AX,1000HJNE LOP2JMP LOP1BAK: POP AXretstart endpcode endsend start6.17stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentBUF DB 16 DUP(0)data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV BX,0MOV DX,260HLOP: OUT DX,ALPUSH DXMOV DX,270HWT: MOV AL,DXSHR AL,1JNC WTPOP DXIN AL,DXMOV BUF[BX],ALINC BXINC DXLOOP LOPretstart endpcode endsend start6.18stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentBUFF DW 100 DUP(0)data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axmov ax,datamov ds,axMOV BX,0MOV CX,100LOP: MOV DX, 380H ;两片74LS244都不选中OUT DX, AL ;产生SC信号启动AD转换INC DXWAIT: IN AL, DX ;读取转换结束信号TEST AL, 4 ;测试CC信号JNZ WAIT ;CC信号为1,表明AD转换未结束,等待IN AL, DX ;CC信号为0,转换结束,读取高4位数据AND AL, 0FH ;屏蔽AL的高4位,保留AL的低4位即高4位数据MOV AH, ALINC DXIN AL, DX ;读取低8位,转换结果在AX中MOV BUFF[BX],AXINC BXINC BXLOOP LOPretstart endpcode endsend start。

(完整版)汇编语言与接口技术习题解答,推荐文档

(完整版)汇编语言与接口技术习题解答,推荐文档

习题一解答: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

汇编与接口-6

14H 1EH 00401000 ESP,8 [00405428],EAX 0FFFFFFFFH EAX,[00405428] EAX 00401000 ESP,8 [0040542C],EAX EBP
stdcall方式
• stdcall方式的调用规则也是使用堆栈传递参数,使用从右向左的 顺序将参数入栈。
• .data
• szFmt byte '%d + %d=%d', 0ah, 0
•x
dword
?
•y
dword
?
•z
dword
?
;输出结果格式字符串
• .code
• AddProc1
proc

mov
eax, esi

add
eax, edi

ret
• AddProc1
endp
• AddProc2
proc
方式
• .386
• .model flat,stdcall
• .data
• .code
• SubProc1 proc
;使用堆栈传递参数

push ebp

mov ebp,esp

mov eax,dword ptr [ebp+8] ;取出第1个参数

sub eax,dword ptr [ebp+12] ;取出第2个参数
• 第1次除法所得的余数是最低位,应该放在最后面,作为字符串 的最后一个字符;最后1次除法所得的余数是最高位,应该作为 字符串的第一个字符。
• szStr • • • • • a10: • • • • • • •
BYTE MOV XOR XOR MOV

汇编语言与接口技术课后答案(1-8章完整版)-王让定朱莹编(下载后可查看剩余几章内容)

汇编语言与接口技术课后答案(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。

汇编语言第6章答案

汇编语言第6章答案

第6章流程控制习题1。

指令指针EIP是通用寄存器还是专用寄存器?有指令能够直接给它赋值吗?哪些指令的执行会改变它的值?解答:EIP是专用寄存器,不能通过指令直接给它赋值。

可以改变其值的指令有:(1)无条件分支,包括:跳转(jmp)、调用(call)、中断(int)。

(2)条件分支,与标志位CF、OF、PF、SF、ZF相关的条件跳转指令。

(3)循环指令,LOOP、LOOPE等。

3.相对于BASIC语言中GOTO语句作用的IA-32处理器指令是哪条?跳转指令jmp习题4.IA-32处理器通过改变EIP寄存器的数值就可以改变程序,如果程序需要无条件跳转到标号done位置执行,使用“MOVL done, %EIP”语句是否可以达到,为什么?如果不能实现该功能,应该使用哪条指令?解答:不能。

不能对EIP寄存器直接赋值.使用指令jmp done可以实现。

习题6条件转移指令Jxx所利用的条件保存在何处?有多少个不同条件的转移指令?保存在EFLAGES寄存器中共16个(P107)习题7JA和JG指令发生跳转的条件都是“大于”,它们有什么区别?在处理带符号值和无符号值时有所区别。

计算无符号值时,使用JA,对于带符号值,使用JG。

习题8。

执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令条件成立、发生转移?movl $0x20, %eaxmovl $0x80,%ebxcmpl %ebx,%eax解答:CF=1 ZF=0 SF=1 OF=0 PF=1可以使得发生转移的指令有:JC JS JP JNZ JNO习题9. 有如下程序片断,请使用一条指令代替其中的两条指令:(1)again:。

jz nextjmp againnext:(2)again:.。

jle nextjmp againnext:解答:(1)jnz again(2)jg again10.假设EAX和ESI存放的是有符号整数,EDX和EDI存放的是无符号整数,请用比较指令和条件转移指令实现以下判断:(1)若EDX > EDI,转到above执行;CMP %EDI,%EDX JA above(2)若EAX 〉ESI,转到greater执行;CMP %ESI,%EAX JG greater(3)若ECX = 0,转到zero执行;CMP $0,%ECX JE zero(4)若EAX-ESI产生溢出,转到overflow执行;CMP %ESI,%EAX JO overflow(5)若ESI≤EAX,转到less_eq执行;CMP %EAX,%ESI JLE less_eq(6)若EDI≤EDX,转到below_eq执行。

汇编6-A

汇编6-A
CPU在执行上面的中断指令后,便产生一个类型 号为n的中断,从而转入对应的中断处理程序。 其中,n是一个0至0FFH的立即数。
36
软件中断(内中断) 中断传送
INT
5
指令演示
之中断源
37
软件中断(内中断)
除法错中断 溢出中断 除法错中断
中断传送
之中断源
CPU遇到特殊情况引起的中断
在执行除法指令时,如果 CPU 发现除数为 0或者商超过 了规定的范围,那么就产生一个除法错中断,中断类型号 规定为0。
34
中断传送
软件中断(内中断)
之中断源
由发生在 CPU 内部的某个事件引起的中断称为 内部中断。由于内部中断是CPU在执行某些指令时 产生,所以也称为软件中断。
内部中断的特点
不需要外部硬件的支持;不受中断允许标志IF的控制。
35
中断传送
软件中断(内中断)
之中断源
中断指令INT引起的中断
中断指令的一般格式 INT n
硬件中断(外中断) 之中断源
由发生在 CPU 外部的某个事件引起的中断称为 外部中断。包括外设中断和故障中断。
CPU有两条外部中断请求线
INTR
CPU
NMI
定时器 键盘 保留 8259A 串行口1 串行口2 硬盘 软盘 打印机
31
中断屏蔽寄存器
中断传送 硬件中断(外中断) 之中断源
PC机上中断屏蔽寄存器的I/O端口地址是21H 其8位对应控制8个外部设备,通过设置这个寄存器的某 位为0或为1来允许或禁止相应外部设备中断。
17
I/O数据传送方式
简单查询传送方式流程
开始
取设备状态信息

已准备好吗?

接口作业——精选推荐

接口作业——精选推荐

接⼝作业第⼆章80861.8086内部主要包括哪些功能部件?它们完成什么功能?答:8086主要包含两个部件。

分别是总线接⼝单元BIU和执⾏单元EU。

完成的功能分别是负责与存储器、I/O端⼝传送数据。

EU的功能是是负责指令的执⾏。

2.总线周期的含义是什么?8088/8086的基本总线周期由⼏个时钟组成?答:总线周期:CPU为了读取或者传送数据,需要通过BIU与存储器或I/O接⼝进⾏信息交互,执⾏对总线的操作。

进⾏⼀次数据传送的总线操作定义为⼀个总线周期。

⼀个总线周期包含4个时钟周期即4个T 状态。

如果⼀个CPU的时钟频率为24MHz,它的⼀个时钟周期为多少?⼀个基本总线周期为多少?答:时钟周期:1/24Mhz= 总线周期:1/24*43.CPU启动时如何寻找系统的启动程序?答:CPU启动时内部的寄存器被复位。

cs为FFFFH,ip为0000h.所以CPU启动时,将从物理地址为FFFF0H 处开始执⾏指令。

此处⼀般存放⼀条⽆条件跳转指令,转移到系统程序的⼊⼝处。

这样,系统⼀旦被启动,便⾃动进⼊系统程序。

6.什么叫中断向量?它放在哪⾥?对应于1CH的中断向量放在哪⾥?答:中断向量即中断处理⼦程序的⼊⼝地址,每个中断类型对应⼀个中断向量。

占⽤4个存储字节。

所有中断向量排列起来,在内存的00000~003FFH形成⼀张表,称为中断向量表。

7.8086如何区分存储器操作和I/O操作?怎样⽤16位寄存器实现对20位地址的寻址答:8086微处理器通过指令区分对存储器的操作和I/O操作。

并通过引脚M/IO发出对应控制信号。

⾼电平时为存储器操作。

低电平时为I/O操作采⽤分段技术实现16位寄存器对20位地址的寻址。

20位的物理地址等于段基址*16+16位的偏移地址第四章奔腾1. 解释Pentium中的分⽀预测技术。

答:1、⼤多数分⽀指令转向每个分⽀的机会是不均等的。

2、⼤多数分⽀转移指令排列在循环程序段中,这两点造成的综合结果是,在程序的运⾏中,同处同⼀条分⽀转移指令可能多次甚⾄成百上千次的循环。

汇编第六章——精选推荐

汇编第六章——精选推荐
段名代表ห้องสมุดไป่ตู้是段地址,是常数,不能使用mov直接送入段寄存器
请求出错错误代码503请尝试刷新页面重试
1, 伪指令end的用法: End:表示程序到此结束 End +标号:表示程序从标号处开始,到此结束 2, 在代码段中使用栈: 例如利用栈,将程序中定义的数据逆序存放:
汇编第六章
思路:找出一段可用内存空间,当作栈使用。再把8个字数据PUSH进栈,再POP
注意:使用ASSUME仅仅表示将某个逻辑段和某个段寄存器关联起来,当作特定的段使用,需在代码段中设置相应的段寄存器值,如 DS,SS
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 ;再送计数值高位。

相关文档
最新文档