汇编语言王爽第三版第十章检测点

10.1补全程序,实现从内存1000:0000处开始执行指令

assume cs:code

stack segment

db 16 dup(0)

stack ends

code segment

start:mov ax,stack

        mov ss,ax

        mov sp,16

        mov ax,___

        push ax

        mov ax,____

        push ax

        retf

code ends

end start

答案:1000h;0           retf相当于:pop IP  pop CS         由题目可知,CS=1000,ip=0,那么先放1000h,再放0,出栈的时候就可以满足题意

 

10.2下面的程序执行后,ax的数值为多少

内存地址                                机器码                               汇编指令

1000:0                                 b8 00 00                            mov ax,0    

1000:3                                    e8 01 00                            call s

1000:6                                    40                                      inc ax

1000:7                                    58                                      s:pop ax

答案:ax=6     解析:call指令先将他后面的的第一个字节的偏移地址,也就是ip,入栈,再转移到标号处,所以出栈的时候,ax=6。

 

10.3下面的程序执行后,ax中的数值为多少?

内存地址                                机器码                               汇编指令

1000:0                                 b8 00 00                            mov ax,0      

1000:3                                    e8 01 00                            call far ptr s

1000:8                                   40                                      inc ax

1000:9                                   58                                      s:pop ax      ---------ax=8

                                                                                         add ax,ax    ---------ax=10h

                                                                                         pop bx         ---------bx=1000h

                                                                                         add ax,bx     --------ax=1010h

答案:                    

解析:call far ptr s相当于push cs     push ip    jmp far ptr s          

 

10.4下面的程序执行后,ax中的数值是多少?

内存地址                            机器码                                   汇编指令

1000:0                           b8 06 00                                 mov ax,6                

1000:3                              ff d0                                        call ax             ------>push 5      jmp [6]

1000:5                              40                                            inc ax

1000:6                                                                               mov bp,sp      ----->原本ss:sp指向5,现在sp赋给了bp

                                                                                          add ax,[bp]  ------->5+6=11=B

答案:000B

 

10.5下面的程序执行后,ax中的数值为多少?(注意用call指令的原理来分析,不要在debug中单步跟踪结果来验证你的结论)

assume cs:code

stack segment

dw 8 dup(0)

stack ends

code segment

start:mov ax,stack 

        mov ss,ax

        mov sp,16

         mov ds,ax

         mov ax,0

        call word ptr ds:[0EH]         ------->将下一条指令的ip地址存入栈,然后jmp到ds:[0EH],那么jmp到哪里去了呢?

        inc ax                                              ip存入到了ss:[0EH],而此时,ds:[0EH]里面的值,又要赋给ip,又因为ds=ss

        inc ax                                              那么意思就是,我们push的ip也就是我们要转移的地方,就是下一条指令!

        inc ax

        mov ax,4c00h

        int 21h

code ends

end start

答案:ax=3

(2)下面的程序执行后,ax和bx中的数值为多少?

assume cs:code

data segment

dw 8 dup(0)

data ends

code segment

start:     mov ax,data

             mov ss,ax

             mov sp,16

             mov word ptr ss:[0],offest s    ------->ss:[0]存放s标号的偏移地址

             mov ss:[2],cs                           -------->ss[2]存放cs段地址

             call dword ptr ss:[0]                --------->push cs,push ip,jmp dword ptr ss:[0]

             nop                                                      从ss:[0]开始,取出两个字,高位给CS,低位给IP

                                                                         又因为,ss原本高位放的是CS,低位放的是S标号的偏移地址

                                                                         所以,相当于 ,转移到下一条指令,nop

            s: mov ax,offset s          --------->ax=s的偏移地址 ,ss:[0cH]里面存放的是nop的ip地址,则相减,等于1,

                sub ax,ss:[0cH]  

             mov bx,cs                                                 

             sub bx,ss:[0eH]                ------>bx=cs,而ss:[0eh]里面存放的也是cs,所以等于0                     

             mov ax,4c00h

             int 21h

code ends

end start

答案:ax==1    bx=0               

你可能感兴趣的:(汇编语言)