汇编语言(第三版) 第十三章课后习题答案

时间:2022-05-24 01:25:25

检测点13.1

7ch中断例程如下:

lp:  push bp

 mov bp,sp dec cx jcxz lpret add [bp+2],bx lpret: pop bp iret

(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
最大位移是FFFFH
检测点13.1

(2)用7ch中断例程完成jmp near ptr s指令功能,用bx向中断例程传送转移位移。
应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

assume cs:code

data segment

     db 'conversation',0

data ends

code segment

start:

     mov ax,data

     mov ds,ax

     mov si,0

     mov ax,0b800h

     mov es,ax

     mov di,12*160

s:   cmp byte ptr [si],0

     je ok

     mov al,[si]

     mov es:[di],al

     inc si

     add di,2

     mov bx,offset s-offset ok

     int 7ch

ok:  mov ax,4c00h

     int 21h

code ends

end start

jmp near ptr s指令的功能为:(ip)=(ip)+16位移,实现段内近转移

assume cs:code  

code segment 

start:

mov ax,cs 

mov ds,ax 

mov si,offset do0                ;设置ds:si指向源地址 

mov ax,0 

mov es,ax 

mov di,200h                      ;设置es:di指向目标地址 

mov cx,offset do0end-offset do0  ;设置cx为传输长度 

cld                              ;设置传输方向为正 

rep movsb 

mov ax,0 

mov es,ax 

mov word ptr es:[7ch*4],200h 

mov word ptr es:[7ch*4+2],0      ;设置中断向量表 

mov ax,4c00h 

int 21h 

do0:

     push bp

mov bp,sp

     add [bp+2],bx                    ;ok的偏移地址+bx得到s的偏移地址

pop bp

iret

mov ax,4c00h 

int 21h 

do0end:

     nop

code ends

end start

检测点13.2

判断下面说法的正误:

(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。

答:错误,FFFF:0处的内容无法改变。

检测点13.2

判断下面说法的正误:

(2)int 19h中断例程,可以由DOS提供。

答:错误,先调用int 19h,后启动DOS。
检测点14.1 读取写入CMOS RAM单元内容

(1)编程,读取CMOS RAM的2号单元内容。

assume cs:code

code segment

start:  mov al,2        ;赋值al

        out 70h,al      ;将al送入端口70h

        in al,71h       ;从端口71h处读出单元内容

        mov ax,4c00h

        int 21h

code ends

end start
检测点14.1

(2)编程,向CMOS RAM的2号单元写入0。

assume cs:code

code segment

start:  mov al,2        ;赋值al

        out 70h,al      ;将al送入端口70h

        mov al,0        ;赋值al

        out 71h,al      ;向端口71h写入数据al

        mov ax,4c00h

        int 21h

code ends

end start

编程,用加法和移位指令计算(ax)=(ax)*10

提示:(ax)*10=(ax)*2+(ax)*8

assume cs:code

code segment

start:  mov bx,ax

        shl ax,1   ;左移1位(ax)=(ax)*2

        mov cl,3

        shl bx,cl       ;左移3位(bx)=(ax)*8

        add ax,bx       ;(ax)=(ax)*2+(ax)*8

        mov ax,4c00h

        int 21h

code ends

end start

;应用举例:计算ffh*10

assume cs:code

code segment

start:  mov ax,0ffh

        mov bx,ax

        shl ax,1   ;左移1位(ax)=(ax)*2

        mov cl,3

        shl bx,cl       ;左移3位(bx)=(ax)*8

        add ax,bx       ;(ax)=(ax)*2+(ax)*8

        mov ax,4c00h

        int 21h

code ends

end start

PS:

左移1位,N=(N)*2

左移2位,N=(N)*4

左移3位,N=(N)*8

左移4位,N=(N)*16

左移5位,N=(N)*32