[汇编]学习笔记

//不知不觉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: 学习笔记

随笔

序章

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


待续...

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

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: 笔记

喵喵喵喵喵~~~

现在开始,这里已经悄然发生了变化喵~

很多都进入水底,成为了黑历史

也有很多新的东西浮出了水面。

qwq~

Tags: 什么都没有哟

2017年计划

往回看看,2016年的计划,那时候算是颓废期。十分怠惰,就连最喜欢的计算机技术也十分怠惰。对自己定的目标也是分的低,想想那时候可真是怠惰啊。花了一年时间调整的我也真是垃圾。
新年快到了啊,原谅我是个传统的男人(男人?孩?人?)只有过了春节,才感觉新的一年来到。所以在这新的一年即将来到之迹,特此写下这篇文章。
新的一年先定下几个大目标吧,可不能像旧的一年一样颓废无能,我已经发觉想要改变现状的方法了。学习更多的技术,有一个那啥成语来着的,养什么稻什么什么hhhhhh。原谅我语文渣。
总而言之,这里列举一些新年计划,来提醒自己,小目标和项目就不提了(毕竟容易弃坑hhhhh),大目标写几个

  1. 音乐技能点满
  2. 熟练使用一门主流,强类型的,程序语言!!
  3. 学习一门外语(可能是日语
  4. 画画技能点满,至少能画出body

感觉2017三开了啊,不只计算机类还走上了文学类和艺术类。感觉压力一下大了起来。
1音乐方面的话我基本都是划水,随便玩一玩,也没啥好的作品。
2的话,强类型程序语言我学的倒是挺多的。什么golang,java,cpp,C#这么一数貌似也不多,然而熟练使用的却没几个!!!!!熟练用的也只有python和php,出门感觉好low,毕竟都是脚本语言,剩下的就是golang了,但是golang的程序体积。。嘛。你们懂的,虽然语法挺舒服,但是那规则。。。
所以希望熟练用一门这些主流语言,这样出门也不会尴尬了hhhhhh
3的话,日语我倒是会一些的,当然,也仅限于游戏王的那一点,日常对话的话我也是还行,毕竟galgame玩的多了,多少能听懂一些。但是我还是感觉这样不行,毕竟,我可是为了以后更方便的啃生肉而来的,这样的日语是不行的!(但是看到背50音我就瞬间不想学了。。。背罗马音可以不hhhhhh
4的话倒是练习很容易,毕竟上课闲的无聊可以随时摸鱼,但是想要练好那可是真的难(想起了家里本来拿来画画却去玩osu玩坏的板子。。。
这些就是今年想实现的大目标。希望今年能够完成!

Tags: 计划

博客搬家/书到啦~

风水轮流转,终于轮到我这80口也被封了啊2333
这可难不倒我,一个url跳转解决的事
于是乎就搬到8081端口了,80和8080端口也封,好气啊!
www可以直接在域名商那里设置。但是@就不行了,所以只能借用猎风酱的腾讯云了QAQ
新域名是http://blog.9bie.org:8081

**

但是,即便是这样,旧域名也能访问
http://9bie.org   和http://www.9bie.org也能访问本站就是了

**

顺便,买的书终于到了QQ图片20161210170520.jpg
入间的书qwq,话说隔壁戏言都动画化了,这个啥时候才能动画化呀QAQ
尴尬的是第四册正好没了,要等下次印刷。。所以只能选秒五了。。其实并不怎么喜欢,因为我并没有异地恋的女票hhhh
早知道换成西尾的《少女不十分》了。港版的书都好贵。。这一本100港币,折合软妹币也要70多
繁体完全无压力,不过第一次看竖着的流行文学类的书也是蛮有意思的欸,因为第一次看所以速度慢了好多。
这一套总共花了560.加上未来要买的书的话应该要630吧233

4.jpg
以及还有这这个,一直关注的。非常非常喜欢的小说。和新海诚《你的名字》题材有点像,不过出现的更早而且个人认为写的更好。
如果新海诚和这部两部同时有动画的话我一定毫不犹豫选择这一步qwq
4本差不多2本,一本50多。伤心,然后喜闻乐见的没钱吃饭了
目前正饿着ing。。。好饿啊。。。

最后晒一晒书价2.jpg
完全的画风突变

Tags: none