📄 releasenote.txt
字号:
========================================================================
DYNAMIC LINK LIBRARY : UCGUIFontGen
========================================================================
/***********************************************************************
REVISION LOG ENTRY
Revision By: UCGUIFontGen.cpp
Revised on 2005-8-29 22:59:53
QQ:106719880
Email:ucgui@163.com
Home:http://www.ucgui.com
Comments: UCGUIFontTool 1.0.0.0
UCGUI字体.C文件导出工具...
***********************************************************************/
1. 完成字体生成工具动态库, 调用接口为ShowGenFontHZDlg(), 弹出字体生成界面,
导出汉字GBK的汉字字体.c文件. 专门用于UCGUI.
2. 可以自定义导出汉字.C文件, 输入自己要使用的汉字及ASCII字符.
3. 跳过0xaaa1~0xafff这几分区, 因为这几个分区没对有对应任何的汉字.
下面附上调试程序时一点收获.
我的程序在DEBUG版时无错, 在RELEASE版出错, 找了半天, 才有如下收获:
错误终于在中午找到了.....收获也实在出乎意料....
看来细节不容错过..
一. i++出现在一个表达式中, 如果有自增运算(++i,不是i++)时的顺序问题
在函数GenOutPutCharLin中有这么一句:
BytePos = (OutputChar[i]-0xa1)*94 + (OutputChar[++i] - 0xa1) + 0x60;
同一句话, 在degbu版下.vc没有进行优化, 他的意思是.
(OutputChar[i]-0xa1)*94 先计算.此时取OutputChar数组第i个元素.
(OutputChar[++i] - 0xa1)后计算.此时i取值增一. 取数组中i+1个元素.
这样的逻辑也是我的本意.
谁知..在release版VC下.居然不是我这样想的.这个错误真是百年难一遇.
怎么也没想到这个错误.
在release版下.被优化成了:
i++;
BytePos = (OutputChar[i]* 95 - (0xa1*95 + 0x60);
这个优化.导致我的程序在release版有问题.但在DEBUG版没有问题.
实在是没有想到.这样一个比较有岐义的写法.导致这种错误.没有想到.优化真
是厉害啊.把那么复杂一个算式.变成那么短了.
比人为计算还聪明..充分利用交换率啊..结合率啊!!!!1
i++;
BytePos = (OutputChar[i]* 95 - (0xa1*95 + 0x60);
精简!! 导致我的错误.
二. 乘法指令的优化.
如果让你用汇编实现A*94.你用最少的指令周期完成.写成哪几句代码?用x86
有两种思路.
一. 直接乘法指令,mul.
二.先将A+A+A. 再将所得值左移4位得值再减A.得值再右移一位.
第一种,指令周期是12.
第二种共用4个周期.eax中着A
lea edx, [eax+eax*2] 一指令周期
shl edx, 4 一指令周期
sub edx, eax 一指令周期
shl edx, 1 一指令周期
这个优化好牛.VC release版优化真够学的....
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -