[汇编]学习笔记

//不知不觉2017了,看着博客发布日期是2016-07-15.

相关文档


汇编指令基础

DIV

div有毒,除数是8位,被除数就得是16位。被除数是16位,除数就得是32位。

div word/byte ptr [ax]

8位情况下,al存商,ah存余数。16位情况下ax存商,dx,存余数。

dw,db,dd

等于开辟内存,dw是开辟4位,称呼为1字。db是2位,称呼为1字节。dd为8位,顾名思义,双字。
db 1 = 01 , dw 1 = 0001 , dd 1 = 00000001

各个寄存器作用

  1. cs,都名思意,Codesegment
  2. ds,也是很容易理解,数据段寄存器
  3. ss,栈寄存器
  4. 通用寄存器有好多,ax,bx,cx,dx,si,di,其中,ax,bx,cx,dx可以分为两个8位寄存器位[]h(igh)高位和[]l(ow),储存八位数据
  5. bp,和ss联用,BP为基址指针,作为校准使用,一般用途是[sp+bp]( 其实是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。
  6. ip,和cs联用,指向下一步执行代码段的地址
  7. sp,和ss联用,一直指向栈顶的指针,pop为sp+=2,push为sp-=2,ss为空时sp指向0,如果push或者pop过多会溢出或者越位,危险!
  8. ES,附加段寄存器,和di寄存器相关联使用,一般是es:di

寻址方式

debug下可以直接[idata],但是在MASM下会忽略[],直接传送数字去了,而不是指向地址的值,[ 0 ]除外。想要那样寻址,一般可以使用 ds : [偏移地址]

jmp

  • jmp short 标号 : 段内短转移,对IP的范围为(-128~127)
    ,并不是通过段:偏移地址来跳转,而是计算目前这条语句到跳转语句的偏移地址来跳转,所以说CPU并不会知道要跳转的地址,而是只知道距离要跳转的地址有多少个字节来跳转
  • jmp near ptr : 段内近转移,范围(-32769~32767),16位位移
  • jmp far ptr : 会连CS:IP一起修改

jcxz,loop

条件转移 jcxz 标号,有条件转移,只有在CX为0时才会转移。当CX!=0时,程序将继续执行下面的指令。这样看来的话,loop指令其实也是一个条件转移指令,每次loop,cx递减1,直到cx为0时跳出循环。注:标号均为8位,范围为-128~127

ret,retf

ret是跳转前的指令,把IP压入读出栈,之后sp-=2,相当于POP IP
retf同等,之不过多了CS,差不多等于POP CS;SP-=2,POP IP;SP-=2

Call指令

Call 标号 ,把当前IP,push入栈之后,跳转到标号地址执行
执行过程为:sp-=2;((ss)x16)+sp = IP#把IP压入栈;IP=IP+16位位移
因为跳转是计算位移而不是更具物理地址跳转,所以16位位移地址 = 标号地址 - call指令之后的第一个地址
因为是16位,所以范围是-32768~32767

标志寄存器

  • ZF 判断结果是否为0,执行结果为0,则ZF为1,反之
  • PF 判断奇偶,偶数为1,基数为0
  • SF 符号寄存器,判断是否带符号。
  • CF 进位或者结尾标志,debug中,NC为没进位,CY为进位,对于无符号数来说才会存在
  • OF 溢出标志位,对于有符号数来说才会存在
  • DF 方向标志位,DF=0,si di都会递减,DF=1,si di都会递增
  • TF 用来检测单步中断,如果TF=1则产生中断

ADC,SBB指令

  • adc,才不是射手呢(doge)带进位加法指令,adc ax,bx 相当于 ax = ax + bx +CF
  • SBB,有加法当然就有减法,带进位减法指令

cmp指令

对比指令,cmp a,b == a-b,只不过不记录结果
这时候我们可以看ZF位就可以进行对比,PF可以判断奇偶,看CF来判断两个大小,但是还要关注SF和OF来判断是否有溢出/进位

检测比较结果的转移指令

  • je,等于则转移 ZF=1
  • jne,不等则转移 ZF=0
  • jb,低于则转移 CF=1
  • jnb,不低于则转移 CF=0
  • ja, 高于则转移 CF=0 ZF=0
  • jna, 不高于则转移 CF=1 或ZF=1

movsb,movsw

功能是将ds:si中的内存单元指向es:di中然后更具DF进行sidi的递增或者递减
(果然我们计算机中的数据都是sb么2333
传送一个字就是movsw,区别就是每次递增或者递减sidi+-=2
可以配合rep指令使用,rep是更具CX重复执行指令

cld,std

有了上面那些,当然要对DF进行操作啦,然而肯定不能用ADD的说。所以就有了cld和std
cld 让DF=0,std让DF=1

CPU调用中断指令

也相当于执行N号中断

  1. 取中断类型码N
  2. push IF,TF
  3. push CS,IP
  4. IP=N4 CS=N4+2

lea

lea指令,格式:lea 目的寄存器,源操作数
作用:将源操作数的地址偏移量保存到目的寄存器中。学习lea指令可以和mov指令一起来记,他们格式相同,但mov指令是将操作数指向的内存中的数据保存到目的寄存器。

函数调用方式

//作用范围为VC++

  1. 首先是在上层函数,在调用函数之前,会先把参数从左到右push进栈
  2. 然后执行call函数,其中call函数又会隐藏触发一个压栈操作,会把IP压入栈
  3. 然后到了被调用函数,会先push ebp,把主函数的ebp保存
  4. 之后mov ebp,esp 更新EBP寄存器的值,更新完成后,被调用函数即可以使用EBP定位它的函数参数和局部变量
  5. 之后esp-00C,创建一片内存空间来保存函数状态
  6. 之后保存上层函数的ebx,esi,edi
  7. 之后在附加段寄存器创建一片空间(创建方式是为ECX赋值然后用rep stos循环写入
  8. 之后开始函数操作
  9. return操作其实是把值传给eax
  10. pop edi,esi,ebx
  11. mov esp,ebp 调整栈顶指针,使esp指向保存有main函数EBP的地址处,为恢复main函数ebp做准备
  12. pop ebp 正式恢复main函数的ebp
  13. ret 会触发一次栈出操作,会把最开始Call压入的IP弹出,然后程序开始执行IP所指向的地址
Tags: 学习笔记

Android玩Kancolle的官方姿势

手机不用VPN不封肝舰娘教程
上面那个是2015年的时候的_(:з)∠)_。。那时候还木有出安卓版,咱只能苦逼的用flash+uc+ooi,又慢又耗电又卡,所以。。。。那时候就弃坑啦QAQ
但是最近,官方安卓版出来了(然而其实已经出来很久了,只是我火星了。
而且!安卓版游戏还不用VPN!!不用VPN!这是最重要的!
最后,更具我的测试,游戏速度极快,耗电也很低。比用flash玩爽多了。而且还可以在谷歌市场上下载插件,美滋滋啊。
当然,登陆的时候还是需要VPN的。
下面是教程;
首先,我们需要三个东西:

  1. 临时的日本VPN,注意必须是日本的
  2. 一台安卓手机
  3. 一个DMM账号

有如上的就够啦,首先我们先用日本VPN,登陆DMM
Screenshot_2017-11-04-21-53-31.png
注意不要被会员登陆给骗了,汉字是登陆实际上是注册。
2.png
拉到最下面,找到DMM GAMES的app,并且下载安装。
Screenshot_2017-11-04-21-54-30.png
打开DMM GAMES APP,并且在里面登陆DMM。
Screenshot_2017-11-04-21-54-40.png
在DMM APP里面找到舰队收藏。(才22mb,选择下载,并且安装。

好了,这时候就可以退出VPN了,这时候我们只需要打开舰队收藏就可以玩啦!
Screenshot_2017-11-04-21-59-58.png
最后推荐一个kanotify,很不错的辅助软件,有大破,补给,远征,修理的提醒,和战斗和路径的预支。
最重要的是有远征攻略和任务翻译!!
详细可以在Google市场里找到Screenshot_2017-11-04-22-00-24.png
Screenshot_2017-11-04-21-54-57.png![][8]

Tags: 舰娘, 手机

随笔

序章

世界上99的人们,都在不停重复着做着同样亦或者是类似的事。
不如说,不只是人类,动物,亦或者是远在太空的各种行星也是。
大到活着-死亡。小到进食,睡觉,捕猎,学习等等。
一切都是一个圆圈,不停着重复着。
人类能进化到现在,只不过是在不断扩大圆圈的体积,但是归根结底,圆圈还是圆圈,依旧不能成为线条活着其他形状。
这个圆圈停了,还有下一个圆圈又开始新的画笔。
所以我在想,这样只有圆圈的世界,能有什么意义呢?


待续...

Tags: 自演乙, 博主脑残ing, 闲得蛋疼

传话娘完全体完成

这个坑可以追溯于搞事情-多博客博客&QQ群联动
那时候因为没办法获取群昵称所以一直脱坑。
现在因为要给群官网弄些黑科技所以怼出来了
QQ图片20171021224028.png
还有点小bug。emmm,不过在MsgTask加入一个过滤自己user_in的就行啦。
代码在这传话娘完全体.rar
改天有机会部署吧XD

Tags: none

MinuPanZ暂时上线

还有联动以及一大堆七七八八东西没加。。不过就这么暂时大你出来吧
https://www.minipanz.com
欢迎来玩

Tags: 官网

新坑Minipanz.com以及十万三千本小黄书

就算高三了我也要搞事emmmm,虽然月考爆炸内心难过ing
脑袋一热就买了MiniPanz.com这个域名。。。其实也算为群做个宣传吧hhhh(其实是闲的蛋疼+无聊。并且考虑可以把各种黑科技挂上过去。
QQ截图20171009215503.jpg
之后想顺便写一个十万三千本小黄书的目录emmmm,毕竟某站没有按照收藏星级来排序的。
我做一个这个顺便提供个API应该蛮多人访问的吧hhhh
顺便挂个ppoi.com(澳门最大的矿产上线啦hhhh,美滋滋
不过认真算算,真的是(五)十万三千本小黄书啊
QQ截图20171009215843.jpg

Tags: 新坑

高三小计/新玩具入手

高三开学不知不觉一个月了。黑板上临近的高考日期也一点一点的让我紧张起来。
虽说是紧张,但是也完全没有干劲。唯一和之前有区别的话,就是上课有认真听,作业也有认真(选)做。
emmmm,其余该看书改学习的时间完全没有认真学习。沉迷漫画/gal/轻小说不可自拔。
不过当然,更多的时间还是在音乐上。毕竟打算考音乐(虽然也用过这个来偷懒)
不过说实话,对自己的水平有点担忧。毕竟完全不知道考试的过程emmmm
然后在zf的安利下,莫名其妙的入了个N900(我还欠舞夏钱啊啊啊啊啊啊 QAQ
1.png
2.png
3.png
(说着不要自己却入了个
TIM图片20171005131456.jpg
TIM图片20171005131505.jpg
最后到手了,成色very Nice!
MAEMO系统。基于linux。
打开之后发现里面还有惊喜
TIM图片20171005131511.jpg
不过缺点就是py版本只有2.5.
而且下载速度捉急TIM截图20171005124951.png
再写这个文章的时候还在蛋疼安装GCC,打算升级py中

Tags: none

报告一下存在表示存活

高三了时间很少_(:з)∠)_。。。
顺带新(旧)坑填坑ing。尽情期待。
顺带转战tg了,tg可以找我玩@bakabie
或者加入tg群,qwq
点我加入
顺带最近的截图qwq。
QQ图片20170912213057.png

Tags: 近况

GalgameOl设计笔记

2017-07-23 00:08

直接提供图片算了,简单粗暴
乱做的示意图.png


2017-07-21 23:15

重大更新,因为不考虑ons引擎,只考虑自己的了,所以得先设计语法,明天zai'shuo


结构如下:

PY后端:

  • manage.py 用户处理websocket事件
  • resolve.py 用于处理引擎

前端就是基础三件套。
目前支持语法
["mov","goto","dwave","bgm","bgmstop","bg","if","SEL","end","fin","gosub"]

可识别语法:
["mov","goto","dwave","print","bgm","lsp","bgmstop","wait","textclear","bg","if","SEL","end","fin","gosub","br"]

通信通过WebSocket通信。

过程:

前端->{dat:游戏脚本路径或者特殊标号}
->后端:

  • 是否第一次运行? 找到第一个游戏段,解析;解析段地址为前端给予的地址
  • 解析

-返回成指定数据格式`
->前端:

  • 数据格式拆包
  • 显示给用户
  • 遇到SEL/END ->发送下一个章节的代码段(代码段在SEL语句里有)->跳转到最上方

后端解析方式:

更具前端返回,判断是否有cs?
有:读取指定的cs段 ; 没有:从第一个cs段开始解析
读入cs端,逐行解析

两个for迭代循环命令,判断语句是否带有上面的可识别命令

遇到执行命令,append到指定的列表中去(bgm,bg,voice等等),并记录文字列表的长度(好让前端知道什么时候显示

如果全都不是,那么认为为文字(文字之前没有任何命令,print什么的都没有,就直接显示)

append到文字列表

持续到逐行全部解析结束
打包成指定数据格式
通过websocket发送给前端

指定数据格式结构:

一段json:

{
    "str":[文本i,文本j....文本n],
    "flag":{用户所包含的文本地址},(这个参数请下一次请求时也请原封不动的传递上来)
    "bgm":{int:资源地址,int:'资源地址'},
    "voice":{int:'资源地址',int:'资源地址'}, 
    "Dwave":{同上},
    "bg":{同上},
    "Next":下一章节标题名,
}

dict格式{int:资源地址},其中int和list 显示文本一一对应。
后期扩展(如特效等等):延长json长度,后面加入更多的特效指令和list对应。
其中,Next一般是SEL语句或者是直接下一章的章节名,如果是SEL语句请更具用户的选择来返回对应的Next。

完整流程:

第一次运行游戏请用ws传递json {"dat":游戏脚本}
同时,ws端将会返回一大段的

{
    "str":[文本i,文本j....文本n],
    "flag":{用户所包含的文本地址},(这个参数请下一次请求时也请原封不动的传递上来)
    "bgm":{i:资源地址,j:'资源地址'},
    "voice":{k:'资源地址',n:'资源地址'},    (ijkl均为int,对应着文本i,j,k,l..)
    "Dwave":{同上},
    "bg":{同上},
    "Next":下一章节标题名,  (这个也请原封不动的传递上来)
}

不同的是Next有时候并不会返回章节名,也许会返回选择支,例如

SEL "敲门","今天这先这样吧","*CA_0","*CA_1"

请更具用户的选择修改给函数传递的cs内容。当然,也有会其他类型的文本

error 说明脚本编写错误,请直接停止游戏,因为脚本无法继续运行下去了

GameEnd/End/Fin 说明已经通关到达结局

传递消息
第二次运行时请传递json {"flag":上一次返回的,"cs",也是上一次返回的} 均为上次返回的值
注意cs可能更具SEL的选择支进行改变
返回的内容同上


2017/5/30更新

程序项目新地址:https://git.oschina.net/gaoshi_team/galgame_server

如你们所见基本没怎么动。

把那个很蠢的函数判断方法换了,用了你个略魔幻的方法
QQ图片20170530181645.png

Tags: 笔记

python-IAT HOOK

难的不是HOOK,而是各种类型的转换。
先占坑。考完试再填。如果你们发现这个文章消失了的话估计就是弃坑了HHHH


2017/7/15
终于填完了,贼难受。头晕晕的,使用方式如图
IAT HOOK:
TIM截图20170714170055.png
LOAD IAT:
TIM截图20170714170432.png
代码在这里iat.rar

Tags: iat, hook
文章总数:104篇 分类总数:3个