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

这是什么意思。。

2006-5-5 02:22
6715

演示进入保护模式的过程:
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位环境下汇编程序设计》地质出版社
这本书的确不怎么好,逻辑混乱,注解也少。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第二个问题:
一般将源程序的前4字节保存,执行源程序时再跳向源4字节。
这4字节是什么内容,为什么一定要先保存呢。
2006-5-5 02:32
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
“左移4位,就相当于乘8”这是错误的说法
2006-5-5 11:16
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是不是错误这是书上的说法,左移1位相当于乘2,右移1移相当于/2,
也许这里不是乘8.但又是什么意思呢。
怎么这么多高手没人回答??
2006-5-6 00:11
0
雪    币: 261
活跃值: (162)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
5
2006-5-6 01:07
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
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字节我记得应该是原函数的的地址(瞎猜的,请不要向我扔转头^_^)
2006-5-6 10:50
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
嗯。谢谢楼上的。
你的意思我知道。
但code和data分明是16位的段地址嘛。。
他作为段描述符放进GPT表中。
干么要左移4位再右移16位呢。。
希望有看过这本书的帮我下。看的很晕。
-------------------------------
第二个问题我有点懂了。
前3B就换成跳向病毒入口处0e9h 地址。
2006-5-6 22:48
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
最初由 seny 发布
是不是错误这是书上的说法,左移1位相当于乘2,右移1移相当于/2,
也许这里不是乘8.但又是什么意思呢。
怎么这么多高手没人回答??


“左移1位相当于乘2”说的过去
但“左移4位相当于乘8”就不知道你怎么算出来的的了
你先算算左移3位相当于乘几?
2006-5-6 22:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
heXer要冒烟了
哼唧
2006-5-6 23:49
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
10
最初由 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
看来只能移位正数了
往上移都一样往下移就有区别了
2006-5-7 13:52
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
呵呵,你自己编一个程序看看不就明白了。
.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
2006-5-7 14:57
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
12
shr和shl是逻辑乘/除方
x shr n/2^x;
x shl n*2^x;
ror和rol是循环乘/除方
x ror “n/2^x”
x rol “n*2^x”
2006-5-7 15:03
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
13
移位那个用windows自带的计算器即可验证。建议楼主先找一本汇编教程看看基础的东西先。
2006-5-7 17:22
0
游客
登录 | 注册 方可回帖
返回
//