首页
社区
课程
招聘
这是什么意思。。
2006-5-5 02:22 6224

这是什么意思。。

2006-5-5 02:22
6224
演示进入保护模式的过程:
xor eax,eax
mov ax,data    ;初始化数据段描述符
mov ds,ax
shl eax,4      ;这个代表什么意思呢
mov dword prt [Gdtptr+2],eax
mov DataDes.basel,ax
shr eax,16     ;这个更搞不懂了。。
mov DataDes.basem,al
mov DataDes.baseh,ah

xor eax,eax   
mov ax,code    ;初始化代码段描述符
shl eax,4
mov CodeDes.basel,ax
shr eax,16
mov CodeDes.basem,al
mov CodeDes.baseh,ah
lgdt qword ptr Gdtptr
..............

《windows32位环境下汇编程序设计》地质出版社
这本书的确不怎么好,逻辑混乱,注解也少。

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞7
打赏
分享
最新回复 (12)
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seny 2006-5-5 02:32
2
0
第二个问题:
一般将源程序的前4字节保存,执行源程序时再跳向源4字节。
这4字节是什么内容,为什么一定要先保存呢。
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
heXer 3 2006-5-5 11:16
3
0
“左移4位,就相当于乘8”这是错误的说法
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seny 2006-5-6 00:11
4
0
是不是错误这是书上的说法,左移1位相当于乘2,右移1移相当于/2,
也许这里不是乘8.但又是什么意思呢。
怎么这么多高手没人回答??
雪    币: 261
活跃值: (162)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
qfejj 7 2006-5-6 01:07
5
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
aa1ss2 2 2006-5-6 10:50
6
0
shr eax,16     ;这个更搞不懂了。。
mov DataDes.basem,al
mov DataDes.baseh,ah
这个的意思是保存eax的前16位
举个例子:

eax=12345678
那么
ax=5678
ah=56
al=78
但是想保存前16位的1234怎么办呢,用shr eax,16就可以了
经过shr eax,16之后
eax=00001234
ax=1234
ah=12
al=34

第二个问题:
一般将源程序的前4字节保存,执行源程序时再跳向源4字节。
这4字节是什么内容,为什么一定要先保存呢。

这4字节我记得应该是原函数的的地址(瞎猜的,请不要向我扔转头^_^)
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
seny 2006-5-6 22:48
7
0
嗯。谢谢楼上的。
你的意思我知道。
但code和data分明是16位的段地址嘛。。
他作为段描述符放进GPT表中。
干么要左移4位再右移16位呢。。
希望有看过这本书的帮我下。看的很晕。
-------------------------------
第二个问题我有点懂了。
前3B就换成跳向病毒入口处0e9h 地址。
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
heXer 3 2006-5-6 22:51
8
0
最初由 seny 发布
是不是错误这是书上的说法,左移1位相当于乘2,右移1移相当于/2,
也许这里不是乘8.但又是什么意思呢。
怎么这么多高手没人回答??


“左移1位相当于乘2”说的过去
但“左移4位相当于乘8”就不知道你怎么算出来的的了
你先算算左移3位相当于乘几?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xuanqing 2006-5-6 23:49
9
0
heXer要冒烟了
哼唧
雪    币: 1272
活跃值: (741)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
Anskya 20 2006-5-7 13:52
10
0
最初由 heXer 发布
“左移1位相当于乘2”说的过去
但“左移4位相当于乘8”就不知道你怎么算出来的的了
你先算算左移3位相当于乘几?

还是heXer对的
shl=x*(n^2)

mov eax,2
shl eax,1
;eax=4

shr刚好相反

"左移1位相当于乘2"
这句应该用在rol上面
他才是*2
ror刚好是/

看看资料发现原来
shl,shr有补码的地方都算0
看来只能移位正数了
往上移都一样往下移就有区别了
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-5-7 14:57
11
0
呵呵,你自己编一个程序看看不就明白了。
.386
.model flat,stdcall
Option CaseMap:None

include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data
        szBuffer db 50 dup(0)
        szFormat db "%08X-%08X-%08X-%08X",0
        n1 dd 0
        n2 dd 0
        n3 dd 0
        n4 dd 0

.CODE
START:
        mov n1,12345678h
        mov n2,12345678h
        mov n3,12345678h
        mov n4,12345678h
        shr n1,16
        shl n2,16
        ror n3,16
        rol n4,16
        invoke wsprintf,addr szBuffer,addr szFormat,n1,n2,n3,n4
        invoke MessageBox,NULL,addr szBuffer,NULL,MB_OK
        invoke ExitProcess,NULL
END START
结果:
n1 = 12345678h shr 16 = 00001234h
n2 = 12345678h shl 16 = 56780000h
n3 = 12345678h ror 16 = 56781234h
n4 = 12345678h rol 16 = 56781234h
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-5-7 15:03
12
0
shr和shl是逻辑乘/除方
x shr n/2^x;
x shl n*2^x;
ror和rol是循环乘/除方
x ror “n/2^x”
x rol “n*2^x”
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
ForEver 20 2006-5-7 17:22
13
0
移位那个用windows自带的计算器即可验证。建议楼主先找一本汇编教程看看基础的东西先。
游客
登录 | 注册 方可回帖
返回