DOS 程序知识点

1. bioskey(0): 返回用户按键。

如果返回值的低 8 位非 0,该值表示按键的 ASCII 码;

如果返回值的低 8 位为 0,该值表示按键的键码。

作为替代,VC 中可以使用 getch() 返回用户按键。对于功能键(如光标键),getch() 需要调用两次,第一次返回 0 或 0xE0,第二次返回键码。

2. bioskey(1): 返回是否有按键发生。

如果没有按键,返回 0;

如果有按键,返回该按键值。(该按键仍然保留)

作为替代,VC 中可以使用 kbhit() 返回是否有按键发生。

3. bioskey(2): 返回当前控制键的状态

返回值共 16 位,分别表示:

0 右 Shift 按下
1 左 Shift 按下
2 Ctrl 按下
3 … Read More

单片机多字节移位除法实现方案

以0x67 / 3来举例 说明:

除数3前面有6个0, 减数从 3 * 2^6 次方 0xC0 开始, 循环去减, 每循环一次
减数/2, 够减则说明被除数中包含了减数/(原始减数3)个原始减数, 商+1, 然后在后面的每一次循环
时移位, 实现了商加上相应倍数的减数.

除数循环7(6+1)次也就到了除数自身, 减最后一次, 循环结束
算法巧妙的利用了移位减法, 以最少的循环次数实现了求商除法运算

被除数               减数                    结果
67[0110 0111] C0[1100 0000] 00[0000 0000]
67[0110 0111] 60[0110 0000] 01[0000 0001]
//够减, +1, 60是3的0x20 倍, 后面不断的左移, 保证了现在的+1最后成为0x20
07[0000 0111] 30[0011 0000] … Read More

用jadx批量反编译jar

因工作中需要反编译大量jar, 因此写了下面的Python脚本, 将Jar放到一个目录里, 即可批量反编译
脚本如下

# -*- coding: utf-8 -*-
import os
import subprocess

def de_jar(dir_1):
    # 列出文件夹下所有的目录与文件
    dirlist = os.listdir(dir_1)
    for i in range(0,len(dirlist)):
        path = os.path.join(dir_1,dirlist[i])
        if os.path.isfile(path):
            #你想对文件的操作
            subprocess.call("jadx -d out " + path, shell=True)
        elif os.path.isdir(path):
            de_jar(path)


de_jar("E:/src")
Read More

IDA 中MFC导入符号名修复脚本

1) dumpbin /exports mfc100u.lib > mfc100u.def
2) using following regex: ^\s+(\d+)\s+([^\s]{1,})(.*) -> \2 @ \1 NONAME

从Def文件生成idc脚本, 进行重命名

https://pan.baidu.com/s/1dGkQc5V :  ee4b

压缩包中包含了 MFC70, 71, 80, 90, 100的相应脚本
如果需要其它的, 压缩包中有脚本可以生成

 

 … Read More

VS 常见编译错误解决方案

错误一:
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new.obj) 中定义
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) 已经在 LIBCMTD.lib(new2.obj) 中定义
nafxcwd.lib(afxmem.obj) : … Read More

Boost库的编译

首先到 Boost的官网下载解压包  http://www.boost.org

解压到自己喜欢的地方.

一、编译

我们以VS2015为例,Boost库1.65.1

进入VS2015的命令行

首先需要先生成 bjam.exe (b2.exe)

运行 bootstrap.bat 等待bjam生成。

然后开始编译Boost库

bjam stage --toolset=msvc-14.0 --without-graph --without-graph_parallel --stagedir="D:\boost\boost_1_65_1\bin\vc14" link=static runtime-link=shared runtime-link=static threading=multi debug release

接下来就是等待了,大约几分钟的时间,就编译好了。可以包含目录使用了。

下面详细解释一下每个参数的含义:

stage/installstage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

toolset指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-14.0(VS2015)等。

without/with选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries

stagedir/prefixstage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

build-dir Read More