鱼C论坛

 找回密码
 立即注册

王爽汇编检测点9.1

已有 547 次阅读2018-1-26 13:32 |个人分类:ASM

检测点:9.1

1

assume cs:code

data segment

    ???????

data ends

code segment

start:  mov ax,data

        mov ds,ax

        mov bx,0

        jmp word ptr [bx+1]

       

        mov ax,4c00H

        int 21H

code ends

end start

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

程序分析:

       1) 这个指令jmp word ptr [bx+1]是一个段内近转移,它只是修改了ip的值。它的转移地址在内存中。明确:[bx+1]在此例子中是只的data段的第二个字节。

       2)我们发现dsbx指向了data段,word ptr [bx+1]指向的是data段中的第二个字节开始的字单元,也就是说它所指向的该字单元的内容。这个内容就是jmp跳转的偏移地址。

       3word ptr [bx+1]指的是一个字单元,也就是说是2个字节,也就是说在data段中是第2和第3个字节,如果jmp转移到程序第一条指令,也就是说ip的值应为:00 00即可;我们要保证这二个字节的值是00 00就行。

       4)要想jmp跳转到start标号处,它的ip值是offset start即可(在汇编语言层面我们也不必关心它们代表的具体ip值是多少);也就是说:(ds[bx+1]==offset start,那么在data段中定义的第二个字节必须是offset start。至于offset start具体代表的二进制码是什么,那是编译器的事情。

       5)第一个字节,你随意定义成什么都行。

       这个结果是多个:

    dw 00xxH, offset start          ;xx代表任意数值(一个字节的)

       讲解:此时借用的是00xxH的高位字节值,00

    db x,0,0                        ;x代表任意数值(一个字节的)

    dd 0                            ;2个字的内存单元,00 00 00 00

db 3 dup (0)

dw 2 dup (0)

dd 0

       简单来说就是,只要ds:[bx+1]起始地址的两个字节为0就可以了

 

       2)程序如下:

assume cs:code

data segment

    dd 12345678H

data ends

code segment

start:  mov ax,data

        mov ds,ax

        mov bx,0

        mov [bx], offset start

        mov [bx+2], code

        jmp dword ptr ds:[0]

       

        mov ax,4c00H

        int 21H

code ends

end start

       补全程序,使csip指向程序的第一条指令。

       程序分析:

       1)在data段中定义了一个双字的值,占用4个字节,内存中是12 34 56 78

        2jmp dword ptr ds:[0]代表的含义是,此指令是段间转移的指令,csip是存储在一个双字的单元中,其中高16位存储的是cs值,低16位存储的是ip值。

       3 [bx]代表了低16位的值==ip[bx+2]代表了高16位的值==cs

       4)也就是说保证data段中前2个字节是ip的值,第3,4字节是cs的值就可以。

       5)答案也就多了。

        [bx]==ip

        offset start

        ptr word 0

        0000H

        bx             

        [bx+2] ==cs

        cs

        code

       3)用Debug查看内存,结果如下:

2000:1000 BE 00 06 00 00 00 ......

则此时,CPU执行指令:

mov ax,2000h

mov es,ax

jmp dword ptr es:[1000h]

程序分析:

1)通过上面二条指令,es指向了段地址是2000H的内存段。

2jmp dword ptr es:[1000h]指令的含义:是一个段间转移指令,指令的转移地址在内存中,该内存单元是一个双字单元(32位的单元),也就是说在1000H地址开始,低16位存储的是ip的值,高16位存储的是cs的值。

3)我们在debug内存存储显示中,不难发现,低16位是BE 00,也就是它的值是00BE。高16位是0600,也就是它的值是0006H

得出结论:(cs)= 0006H (ip)= 00BEH


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 21:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部