[汇编语言] 检测点10.5

2019-07-28  本文已影响0人  耿杰

目录

正文

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

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:[0H]
        inc ax
        inc ax
        inc ax
   
        mov ax, 4c00h
        int 21h 
         
code ends
end start

解答

assume cs:code

stack segment
    dw 8 dup (0)
stack ends

code segment
     start: 
        
        mov ax, stack            ; IP:0000
        mov ss, ax               ; IP:0003
        mov sp, 16               ; IP:0005
        mov ds, ax               ; IP:0008
        mov ax, 0                ; IP:000A
        call word ptr ds:[0EH]    ; IP:000C
        inc ax                   ; IP:0011
        inc ax                   ; IP:0012
        inc ax                   ; IP:0013
   
        mov ax, 4c00h
        int 21h 
         
code ends
end start
00  00   00  00  00  00  00  00 00  00   00  00  00  00  00  00
push IP
jmp word ptr ds:[0EH]

push IP

00  00   00  00  00  00  00  00 00  00   00  00  00  00  11  00

jmp word ptr ds:[0EH]

ds 就是指向 stack
ds:[0EH] 就是指向的 stack:[0EH]对应的值,也就是 0011

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], offset s     
        mov ss:[2], cs
        call dword ptr ss:[0]
        nop
       s:
       mov ax, offset s
       sub ax, ss:[0CH]
       mov bx, cs
       sub bx, ss:[0EH]
       
       mov ax, 4c00h
       int 21h
code ends

end start

解析前先了解一下常见指令占用多少个字节

内存地址只能对以下寄存器直接赋值:
    ax、bx、cx、dx、sp、bp、si、di
立即数只能对以下寄存器直接赋值:
    ax、bx、cx、dx、sp、bp、si、di
mov ss:[0], 16
1、立即数16,小于256,所以是占用1个字节,机器码为:10
2、偏移地址:[3]占用2个字节,机器码为: 0300
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用5个字节
mov ss:[0], 16
mov ss:[0],  256
1、立即数256,大于255且小于65535,所以是占用2个字节,机器码为:0100
2、偏移地址:[0]占用2个字节,机器码为: 0000
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用7个字节
mov ss:[0], 256
mov word ptr ss:[0],16
1、立即数16,小于256,所以是占用1个字节,但是有指令word ptr,所以是占用2个字节
2、偏移地址:[0]占用2个字节,机器码为: 0000
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用7个字节
mov word ptr ss:[0],16
1、偏移地址:[2]占用2个字节,最大值为65535,机器码为: 0002
2、总共占用5个字节
mov ss:[2], cs

答案分析

assume cs:code

data segment
    dw 8 dup (0)   
data ends       

code segment
    start:
        mov ax, data                      ; IP:0000
        mov ss, ax                        ; IP:0003
        mov sp, 16                        ; IP:0005
        mov word ptr ss:[0], offset s     ; IP:0008
        mov ss:[2], cs                    ; IP:000F
        call dword ptr ss:[0]             ; IP:0014
        nop                               ; IP:0019
       s:
       mov ax, offset s                   ; IP:001A
       sub ax, ss:[0CH]                   ; IP:001D
       mov bx, cs                         ; IP:0022
       sub bx, ss:[0EH]                   ; IP:0024
       
       mov ax, 4c00h
       int 21h
code ends
end start
assume cs:code

data segment
    dw 8 dup (0)  
// 0710:0000内存空间: 00 00 00 00 | 00 00 00 00|  00 00 00 00 |  00 00 00 00
data ends       

code segment
    start:
        mov ax, data                      // ax = 0710H
        mov ss, ax                        // ss = 0710H
        mov sp, 16                        // sp = 16
        mov word ptr ss:[0], offset s     
// 0710:0000内存空间: 1A 00 00 00 | 00 00 00 | 00 00 00 00 | 00 00 00 00 

        mov ss:[2], cs       
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00  

        call dword ptr ss:[0]            
// IP : 0CH
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00 | 00  00 11 07 

// 1、先把CS的值0711H,push到栈中,SP =  0EH
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00|  00 00  11 07 

// 2、再把IP的值0019,push到栈中,SP =  0CH
// 0710:0000内存空间: 1A 00 11 07 | 00 00 00 00 | 00 00 00 00|  19 00  11 07 

// 3、dword ptr ss:[0] 对应的是 001A,jmp 0711:001A
// CS = 0711, IP: 001A

// 4、也就是直接执行到  mov ax, offset s 指令

        nop                               
       s:
       mov ax, offset s                  
       ; ax = 001AH

       sub ax, ss:[0CH]    
// ss:[0CH] = 0019  
// ax = 001AH - 0019H = 0001H
        
       mov bx, cs
// bx = 0711H                      
       sub bx, ss:[0EH]   
// ss:[0EH] =  11H
// bx = 0711H - 0711H = 0000H               
       
       mov ax, 4c00h
       int 21h
code ends
end start
上一篇 下一篇

猜你喜欢

热点阅读