[汇编语言] 检测点10.5

目录

  • 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # 常见汇编代码 # 1. 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中 code...
    喝豆腐脑加糖阅读 2,724评论 0 0
  • 王爽汇编全书知识点大纲 第一章 基础知识 机器语言 汇编语言的产生 汇编语言的组成 存储器 cpu对存储器的读写 ...
    2c3ba901516f阅读 2,469评论 0 1
  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 8,190评论 1 10
  • 一、基础知识 mov ax,bx把BX内容送到AX中。汇编语言有3类指令,汇编指令、伪指令,其他符号。CPU通过地...
    赤果_b4a7阅读 1,907评论 0 1
  • 汇编语言的一些注意点 汇编语言是直接在硬件之上工作的编程语言。 CPU(Central Processing Un...
    BackSpace8阅读 1,816评论 0 1