美文网首页
[汇编语言] 检测点10.5

[汇编语言] 检测点10.5

作者: 耿杰 | 来源:发表于2019-07-28 22:46 被阅读0次

目录

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

正文

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

解答

  • 1、先指出每个指令IP寄存器的值
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
  • 2、在执行 call word ptr ds:[0H]的之前,栈空间的值为下
00  00   00  00  00  00  00  00 00  00   00  00  00  00  00  00
  • 3、在执行 call word ptr ds:[0H]的时候,做了以下两步操作
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

  • 4、最终也就是让 IP指向0011的位置。就是inc ax,继续执行代码。所以ax = 0003

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

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

  • 1、mov ax, data 占用3个字节。data是数据段、栈段也就是内存地址,跟立即数一样的结果。
内存地址只能对以下寄存器直接赋值:
    ax、bx、cx、dx、sp、bp、si、di
  • 2、mov ss, ax, 对寄存器直接赋值的, 占用2个字节。

  • 3、mov sp, 16 占用3个字节。

立即数只能对以下寄存器直接赋值:
    ax、bx、cx、dx、sp、bp、si、di
  • 4、mov word ptr ss:[0], offset s 占用7个字节。

    • 小于255是1个字节
mov ss:[0], 16
1、立即数16,小于256,所以是占用1个字节,机器码为:10
2、偏移地址:[3]占用2个字节,机器码为: 0300
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用5个字节
mov ss:[0], 16
  • 大于255且小于65535是2个字节
mov ss:[0],  256
1、立即数256,大于255且小于65535,所以是占用2个字节,机器码为:0100
2、偏移地址:[0]占用2个字节,机器码为: 0000
3、对寄存器ss:[idata]进行赋值,占用3个字节
4、那么总共占用7个字节
mov ss:[0], 256
  • 那么如果小于256,如何让立即数占用2个字节呢?
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
  • 5、mov ss:[2], cs,其中cs如果是bxcxdxdsss,都是占用5个字节。
1、偏移地址:[2]占用2个字节,最大值为65535,机器码为: 0002
2、总共占用5个字节
mov ss:[2], cs
  • 6、注意:mov ss:[2], ax,占用的是4个字节
    mov ss:[2], ax

答案分析

  • 1、先把对应IP的值写上
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
  • 2、假如data对应的内存为0710H, 那么CS对应的内存0711H
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

相关文章

  • [汇编语言] 检测点10.5

    目录 1、下面的程序执行后,ax中的数值为多少? 2、下面的程序执行后,ax和bx中的数值为多少? 正文 1、下面...

  • [汇编语言] 检测点11.3

    一、 补全下面的程序,统计F000:0处32个字节中,大小[32, 128]的数据的个数。 解答 二、 补全下面的...

  • [汇编语言] 检测点11.4

    一、下面的程序执行后:(ax) = ? 解答 1、mov ax, 0 2、push ax 3、pops 4、mov...

  • [汇编语言] 检测点11.2

    一、写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值 答案:逐条分析 1、sub al, al 2...

  • [汇编语言] 检测点13.1

    一、在上面的内容中,我们用7ch 中断例程实现loop的功能,则上面的7ch 中断例程所能进行的最大转移位移是多少...

  • [汇编语言] 检测点13.2

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

  • [001][汇编语言]检测点1.1 地址总线

    《汇编语言》检测点1.1 8421 16进制转二进制 需要知道简单的8421十六进制到二进制转换法,不然可能会看不...

  • 汇编语言第三版-检测点13.1

    分析:1. 首先我们知道中断例程是中断处理程序,它是安装在内存的某处地方,并在中断向量表中登记。所以我们可以把这个...

  • 汇编语言(第三版)-- 检测点9.1

    若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据? 要使jmp指令执...

  • 汇编语言(第三版)-- 检测点9.3

    loop只有当 cx-1> 0时才会继续循环,因此如果传入cl的值为0,则cl与ch组合为0,需加上1才可以满足c...

网友评论

      本文标题:[汇编语言] 检测点10.5

      本文链接:https://www.haomeiwen.com/subject/zzbwlctx.html