【王爽-汇编语言】第十章检测题分析

时间:2022-08-12 00:42:36

第10章汇编测试题目

 

 

下列哪条指令不能够使CS:IP指向当前内存段范围内以s为标号的代码段______。 (4)
 1、  jmp near ptr s
 2、  jmp far ptr s
 3、  call near ptr s
 4、  call word ptr s

 

 

分析:call word后 必须明确给出内存单元地址,而不是给出标号s

 

 

下面指令执行后,ax中的数值为多少____                          (2)
     内存地址 机器码                   汇编指令
      1000:0 b8 00 00              mov ax,0
      1000:3 9a 09 00 00 10   call far ptr s
      1000:8 40                       inc ax
      1000:9 58                      s:pop ax
                                            add ax,ax
                                            pop bx
                                           add ax,bx
 1、  1006h
 2、  1010h
 3、  0020h
 4、  000ch

 

 

分析:
程序执行到call far ptr s后,先把cs也压入堆栈中,然后把将IP=8压入堆栈中
pop ax 后,ax = 堆栈中的IP,即ax=8
pop bx 后,bx = CS =1000H
故:ax = 8+8 +1000H = 1010H

 

 


补全程序,实现从内存1000:0处开始执行指令。 (3)
     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


 1、  cs,ip
 2、  0,1000h
 3、  1000h,0
 4、  0,1000

 

分析:
主要是考核retf和堆栈的后进先出。
执行retf,相当于执行:pop IP   pop CX
故,压栈时,先压入cx,再压入 IP

 

 


下面的程序执行后,ax中的数值为多少____ (4)
     内存地址 机器码     汇编指令
      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
 1、  3
 2、  1
 3、  4
 4、  6

 

分析:
  当执行到call s时,IP地址为6
  然后去执行call s操作,将6压入堆栈
  到标号s处,将ax弹出 ax = 6

 


对下列程序说法正确的是_____。 (4)
     assume cs:codesg
     stack segment
     dw 10 dup (0)
     stack ends
     codesg segment
      mov ax,4c00h
      int 21h
     start: mov ax,stack
      mov ss,ax
      mov sp,20
      mov ax,0
      push cs
      push ax
      mov bx,0
      retf
     codesg ends
     end start
 1、  程序中start之后的汇编指令不能得到执行。
 2、  程序加载后stack段在内存中实际占用的内存空间是20b。
 3、  程序的每一条指令都能获得执行,但不能正常返回。
 4、  指令retf可替换为ret,并能够正常返回。

 

 

分析:
    1.end Start 指明了程序从start处开始运行,所有,start之后的汇编指令能够得到执行
    2.因为段的大小必须是16的倍数,所以,实际占用的内存空间是32B
    3.程序能够正确返回
    4.正确,因为本程序中栈内的cs并未被改变 所以执行后ip =0 cs=cs依然可以返回

 


某程序中定义了如下数据: 
data segment 
db "Hello" 
db 'world' 
db "!" 
db 'W','elcome' 
db "to","masm!" 
db "Bye",'b','ye!' 
dw 0,1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh 
dd 16 dup (0) 
data ends 
下列说法正确的是______。  (3)

 


1、 该程序加载后其中的字符数据和数字数据在内存中都是以ASCII码的形式存放的。 
2、 该程序加载后这组数据在内存中所占用实际空间是90HB。 
3、 该数据段定义可放在该程序中end伪指令之前的任何位置。 
4、 在编译阶段,该程序因如此定义数据而报错。

 

 

分析:
1.该程序加载后其中的字符数据和数字数据在内存中都是以二进制形式存放的。 
2.在该程序中,db定义的数据长度为32B ,dw定义的数据长度为32B ,dd定义的数据64B 一共为80HB
3.正确
4.不会报错

 

 

 

下面的程序执行后,ax中的数值是多少____ 11
内存地址 机器码      汇编指令 
1000:0 b8 00 00  mov ax,6 
1000:2 ff d0        call ax 
1000:5 40           inc ax 
1000:6                mov bp,sp 
                           add ax,[bp]  

 

 

分析:
mov ax,6       ;ax = 6
call ax        ;push 5, ip=6
inc ax         ;
mov bp,sp      ;bp = sp
add ax,[bp]    ;ax = 6 ss:[sp] = 5
所以,ax= 6+5 = 11

 

 

 

下面的程序执行完add ax,5时,ax中的数值为多少____ 8
                     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                          ;ds和ss指向stack sp=16 ax=0
                      call word ptr ds:[0EH]      ; s的偏移地址被压入栈底,同时程序跳转到s
            s:      add ax,2                           ;ax=2
                      inc ax                               ;ax=3
                      add ax,5                          ;ax=8
                      mov ax,4c00H
                      int 21H
                     code ends
                     end start