S_18 发表于 2013-7-25 23:56:51

S。今天汇编的第三个问题!

本帖最后由 S_18 于 2013-7-26 20:24 编辑

jmp指令没学好 表示汇编监测点9.1三道题压力很大 哪位大神可以帮我解一下 谢谢。

Crazy迷恋. 发表于 2013-7-25 23:56:52

本帖最后由 Crazy迷恋. 于 2013-7-26 10:43 编辑

我先给出9.1.1(朋友学的真快~~~要超过我这个菜鸟咯~~~)
这道题首先定义了数据段为dw 2 dup(0);2个dw类型 值为0;。这里真正考核的是jmp word ptr 这样的一种跳法,jmp word ptr [内存单元地址](段内跳转),取得内存单元地址的 值做为偏移地址。为一个字也就是两个字节。bx为0那它+1就是指向第一条指令。为什么呢~~因为是向内存寻找内容。其段地址为ds。前边设置ds为里边那两个双字未0.所以寻得ds:【bx+1】得到的内容就是0.那这个0用在jmp时它并修改IP的值。使得它指向这里。
-----------------------------------------------------------

这道题和上道题其实是一样的~~不同的只是jmp dword ptr ds;这句我在笔记中是这样解释的
jmp dword ptr[内存段元地址](段间),此为双字
高地址为段地址,低地址为目的偏移地址
(cs)=(内存单元地址+2)
(IP)=(内存单元地址)
所以 mov ,bx   bx为0因此它向bx里边前十六位全部置0了。也就是说跳转到的地方的偏移地址为0;而后十六位是将cs 直接赋值给了后16-32的高位置位置。也就是当前的一个段地址。因此它跳转也就是jmp修改后得到的 值cs=当前代码段的段地址,IP为0.

-----------------------
是一个-d命令第三题~~自己做吧~~~前两个弄懂了第三个 很好懂 ~~不懂就再看一遍视频~~

liangivws 发表于 2013-7-26 00:08:15


检测点9.1

(1)程序如下。

assume cs:code

data segment

   dw 2 dup (0)

data ends

code segment

start: mov ax,dtat

         mov ds,ax

         mov bx,0

         jmp word ptr

code ends

end start

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



答案①db 3 dup (0)

答案②dw 2 dup (0)

答案③dd 0

jmp word ptr 为段内转移,要CS:IP指向程序的第一条指令,应设置ds:的字单元(2个字节)存放数据应为0,则(ip)=ds:=0

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



检测点9.1

(1)程序如下。

assume cs:code

data segment

   dd 12345678h

data ends

code segment

start: mov ax,data

         mov ds,ax

         mov bx,0

         mov ,bx      ;或mov , word ptr 0   ;或mov , offset start

         mov ,cs    ;或mov ,cs          ;或mov , seg code   

         jmp dword ptr ds:

code ends

end start

补全程序,使用jmp指令执行后,CS:IP指向程序的第一条指令。



第一格可填①mov ,bx      ②mov ,word ptr 0③mov ,offset start等。

第二格可填①mov ,cs   ②mov ,cs         ③mov ,seg code等。

解析:

jmp dword ptr ds:为段间转移,(cs)=(内存单元地址+2),(ip)=(内存单元地址),要CS:IP指向程序的第一条指令,第一条程序地址cs:0,应设置CS:IP指向cs:0

程序中的mov ,bx这条指令,是将ip设置为0

mov ,cs,将cs这个段地址放入内存单元

执行后,cs应该不变,只调整ip为0,(ip)=ds:=0



C:\DOCUME~1\SNUSER>debug jc9-1.exe

-r

AX=0000BX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C3EES=0C3ESS=0C4ECS=0C4FIP=0000   NV UP EI PL NZ NA PO NC

0C4F:0000 B84E0C      MOV   AX,0C4E

-t

AX=0C4EBX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C3EES=0C3ESS=0C4ECS=0C4FIP=0003   NV UP EI PL NZ NA PO NC

0C4F:0003 8ED8          MOV   DS,AX

-t

AX=0C4EBX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C4EES=0C3ESS=0C4ECS=0C4FIP=0005   NV UP EI PL NZ NA PO NC

0C4F:0005 BB0000      MOV   BX,0000

-t

AX=0C4EBX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C4EES=0C3ESS=0C4ECS=0C4FIP=0008   NV UP EI PL NZ NA PO NC

0C4F:0008 891F          MOV   ,BX                        DS:0000=5678

-t

AX=0C4EBX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C4EES=0C3ESS=0C4ECS=0C4FIP=000A   NV UP EI PL NZ NA PO NC

0C4F:000A 8C4F02      MOV   ,CS                     DS:0002=1234

-t

AX=0C4EBX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C4EES=0C3ESS=0C4ECS=0C4FIP=000D   NV UP EI PL NZ NA PO NC

0C4F:000D FF2E0000      JMP   FAR                      DS:0000=0000

-t

AX=0C4EBX=0000CX=0021DX=0000SP=0000BP=0000SI=0000DI=0000

DS=0C4EES=0C3ESS=0C4ECS=0C4FIP=0000   NV UP EI PL NZ NA PO NC

0C4F:0000 B84E0C      MOV   AX,0C4E

-q

检测点9.1

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

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

则此时,CPU执行指令:

mov ax,2000h

mov es,ax

jmp dword ptr es:

后,(cs)= 0006H ,(ip)= 00BEH



解析:

jmp dword ptr为段间转移,高位存放段地址,低位存放偏移地址

(cs)=(内存单元地址+2),(ip)=(内存单元地址)



根据书P16,对于寄存器AX,AH为高位(前1字节为高位),AL为低位(后1字节为低位)

推算出(内存单元地址)=00beh,(内存单元地址+2)=0006h

根据书P182,高位存放段地址(后2个字节为高位),低位存放偏移地址(前2个字节为低位)

(cs)=(内存单元地址+2),(ip)=(内存单元地址)

推算出(cs)=0006h,(ip)=00beh



用debug跟踪,可能会出现如下错误,debug给出的答案是(cs)不变,(ip)=1000h

C:\DOCUME~1\SNUSER>debug

-r es

ES 0BF9

:2000

-e 2000:1000 be 00 06 00 00 00

-a

0BF9:0100 mov ax,2000

0BF9:0103 mov es,ax

0BF9:0105 jmp dword ptr es:

                        ^ Error

0BF9:0105 jmp dword ptr 2000:1000

0BF9:0108

-r

AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0BF9ES=2000SS=0BF9CS=0BF9IP=0100   NV UP EI PL NZ NA PO NC

0BF9:0100 B80020      MOV   AX,2000

-t

AX=2000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0BF9ES=2000SS=0BF9CS=0BF9IP=0103   NV UP EI PL NZ NA PO NC

0BF9:0103 8EC0          MOV   ES,AX

-t

AX=2000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0BF9ES=2000SS=0BF9CS=0BF9IP=0105   NV UP EI PL NZ NA PO NC

0BF9:0105 E9F80E      JMP   1000

-t

AX=2000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0BF9ES=2000SS=0BF9CS=0BF9IP=1000   NV UP EI PL NZ NA PO NC

0BF9:1000 E475          IN      AL,75

出现错误的原因是:

jmp dword ptr es:对应的debug下的指令并不是你给出的

jmp dword ptr 2000:这样的形式,可以看出,当你写出上述指令后,运行的时候其指令仅仅变成了jmp 1000,缺少了一个指定段地址的指令。



我们可以写一个源程序模拟一下上面的这段程序

assume cs:codesg

data segment

      db 0BEH,0,6,0,0,0

data ends

codesg segment

start:

mov ax,data

mov es,ax

jmp dword ptr es:

codesg ends

end start   

上面这个程序,数据地址是程序分配的,不是指定的那个地址,但是,对于我们理解程序运行的整个过程没有影响。下面是debug的信息

-t

AX=1438BX=0000CX=001ADX=0000SP=0000BP=0000SI=0000DI=0000

DS=1428ES=1428SS=1438CS=1439IP=0003   NV UP EI PL NZ NA PO NC

1439:0003 8EC0          MOV   ES,AX

-t

AX=1438BX=0000CX=001ADX=0000SP=0000BP=0000SI=0000DI=0000

DS=1428ES=1438SS=1438CS=1439IP=0005   NV UP EI PL NZ NA PO NC

1439:0005 26            ES:

1439:0006 FF2E0000      JMP   FAR                          ES:0000=00BE

-d es:0 f

1438:0000BE 00 06 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t

AX=1438BX=0000CX=001ADX=0000SP=0000BP=0000SI=0000DI=0000

DS=1428ES=1438SS=1438CS=0006IP=00BE   NV UP EI PL NZ NA PO NC

0006:00BE 00F0          ADD   AL,DH

我们可以看到,源程序中jmp dword ptr es: 对应的debug下的汇编指令是

1439:0005 26            ES:

1439:0006 FF2E0000      JMP   FAR    

而不是仅仅的一个(JMP 地址)那样的形式,所以,你在debug下的操作本身就是不行的。

另外,此题目的检测目的就是将内存中的数据作为跳转的CS和IP的值来进行跳转。对于给定的一个地址A,A开始的一个字单元是IP,A+2开始的一个字段元是CS。也就是以A为其实地址的内存中,低字单元是IP,高字单元是CS。



如非要在DEBUG中进行操作,可用以下方式:

-e 2000:1000 be 00 06 00 00 00

-a

139A:0100 mov ax,2000

139A:0103 mov es,ax

139A:0105 es:

139A:0106 jmp far

139A:010A

-u

139A:0100 B80020      MOV   AX,2000

139A:0103 8EC0          MOV   ES,AX

139A:0105 26            ES:

139A:0106 FF2E0010      JMP   FAR

-r

AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=139AES=139ASS=139ACS=139AIP=0100   NV UP EI PL NZ NA PO NC

139A:0100 B80020      MOV   AX,2000

-t

AX=2000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=139AES=139ASS=139ACS=139AIP=0103   NV UP EI PL NZ NA PO NC

139A:0103 8EC0          MOV   ES,AX

-t

AX=2000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=139AES=2000SS=139ACS=139AIP=0105   NV UP EI PL NZ NA PO NC

139A:0105 26            ES:

139A:0106 FF2E0010      JMP   FAR                          ES:1000=00BE

-t

AX=2000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=139AES=2000SS=139ACS=0006IP=00BE   NV UP EI PL NZ NA PO NC

0006:00BE 00F0          ADD   AL,DH

-

S_18 发表于 2013-7-26 00:22:49

liangivws 发表于 2013-7-26 00:08 static/image/common/back.gif
检测点9.1

(1)程序如下。


额 请不要复制好吗,我看过注解了 没看懂

liangivws 发表于 2013-7-26 00:34:04

S_18 发表于 2013-7-26 00:22 static/image/common/back.gif
额 请不要复制好吗,我看过注解了 没看懂

这么简单还看不明白。。

S_18 发表于 2013-7-26 00:55:45

liangivws 发表于 2013-7-26 00:34 static/image/common/back.gif
这么简单还看不明白。。

不懂。   

S_18 发表于 2013-7-26 20:23:59

Crazy迷恋. 发表于 2013-7-26 09:27 static/image/common/back.gif
我先给出9.1.1(朋友学的真快~~~要超过我这个菜鸟咯~~~)
这道题首先定义了数据段为dw 2 dup(0);2个dw类 ...

哎 我才是小菜鸟。谢谢了。
页: [1]
查看完整版本: S。今天汇编的第三个问题!