|
Keil 字符串编译时会将汉字的 FD 内码忽略,受影响的汉字:
- 三 数 正 她 升 引 饼 昌 除 待 谍 洱 俘 庚 过 糊 积 箭 烬 君 魁 例 笼 慢 谬
- 凝 琵 讫 驱 褒 听 妄 锡 淆 旋 妖 育 札 铸 佚 冽 邶 埤 荦 蔟 摭 啐 帻 猃 恺
- 泯 潺 妪 纨 琮 椠 辇 挲 臊 忑 睚 铨 稞 瘕 颀 螨 簖 酏 觚 鳊 鼾
复制代码
C:
- #include "reg51.h"
- unsigned char code *text = "AAAA三个数ZZZZ";
- void main() {
- P0 = text[0];
- while (1);
- }
复制代码
ASM:
编译结果:
修复方法:
方法1:用16进制编辑器打开 X:\Keil\C51\BIN\ 目录下的 A51.exe、C51.exe 文件,将16进制数据 80FBFD 替换为 80FBFF 保存即可。
方法2:使用PHP修改,粘贴以下源码保存到 X:\Keil\C51\BIN\ 目录,使用 php.exe 运行:
- <?php
- if(isset($_SERVER['SERVER_PORT'])){
- header('Content-type:text/html;charset=gb2312');
- exit('请将本文件保存到 X:\Keil\C51\BIN\ 目录下,并使用 php.exe 运行。');
- }
- exec('chcp 936');
- echo "\r\n";
- define('C',__DIR__.'/C51.exe');
- define('A',__DIR__.'/A51.exe');
- define('CB',__DIR__.'/C51.exe.bak');
- define('AB',__DIR__.'/A51.exe.bak');
- define('_80FBFD',chr(0x80).chr(0xFB).chr(0xFD));
- define('_80FBFF',chr(0x80).chr(0xFB).chr(0xFF));
- function stop($text){
- echo $text;
- sleep(3);
- exit('');
- }
- if(!file_exists(C) || !file_exists(A)){
- stop('找不到 C51.exe 以及 A51.exe 请将本文件保存到 X:\Keil\C51\BIN\ 目录下。');
- }elseif(file_exists(CB) || file_exists(AB)){
- stop('C51.exe.bak 或 A51.exe.bak 备份文件已存在。');
- }
- define('CD',file_get_contents(C));
- define('AD',file_get_contents(A));
- if(strpos(CD,_80FBFD) === false){
- stop('C51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。');
- }elseif(strpos(AD,_80FBFD) === false){
- stop('A51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。');
- }elseif(@file_put_contents(CB,CD) == false){
- stop('C51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。');
- }elseif(@file_put_contents(AB,AD) == false){
- stop('A51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。');
- }elseif(file_put_contents(C,str_replace(_80FBFD,_80FBFF,CD)) == false) {
- stop('C51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。');
- }elseif(file_put_contents(A,str_replace(_80FBFD,_80FBFF,AD)) == false) {
- stop('A51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。');
- }
- stop('打补丁成功! 如有问题可将 .bak 文件改名还原。');
- ?>
复制代码
方法3:修改程序源码,对受影响的汉字尾部加 \xFD 字样:
- #include "reg51.h"
- unsigned char code *text = "AAAA三\xFD个数\xFDZZZZ";
- void main() {
- P0 = text[0];
- while (1);
- }
复制代码
方法4:使用易语言修改:
- .版本 2
- .程序集 程序集1
- .子程序 输出文本
- .参数 文本, 文本型
- 信息框 (文本, 0, , )
- 结束 ()
- .子程序 _启动子程序, 整数型
- .局部变量 C, 文本型, , , C51.exe 路径
- .局部变量 A, 文本型, , , A51.exe 路径
- .局部变量 CB, 文本型, , , C51.exe.bak 路径
- .局部变量 AB, 文本型, , , A51.exe.bak 路径
- .局部变量 CD, 字节集, , , C51.exe 数据
- .局部变量 AD, 字节集, , , A51.exe 数据
- .局部变量 _80FBFD, 字节集
- .局部变量 _80FBFF, 字节集
- C = 取运行目录 () + “\C51.exe”
- A = 取运行目录 () + “\A51.exe”
- CB = 取运行目录 () + “\C51.exe.bak”
- AB = 取运行目录 () + “\A51.exe.bak”
- _80FBFD = { 128, 251, 253 }
- _80FBFF = { 128, 251, 255 }
- .判断开始 (文件是否存在 (C) = 假 或 文件是否存在 (A) = 假)
- 输出文本 (“找不到 C51.exe 以及 A51.exe 请将本文件保存到 X:\Keil\C51\BIN\ 目录下。”)
- 返回 (0)
- .判断 (文件是否存在 (CB) 或 文件是否存在 (AB))
- 输出文本 (“C51.exe.bak 或 A51.exe.bak 备份文件已存在。”)
- .默认
- .判断结束
- CD = 读入文件 (C)
- AD = 读入文件 (A)
- .判断开始 (寻找字节集 (CD, _80FBFD, ) = -1)
- 输出文本 (“C51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。”)
- .判断 (寻找字节集 (AD, _80FBFD, ) = -1)
- 输出文本 (“A51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。”)
- .判断 (写到文件 (CB, CD) = 假)
- 输出文本 (“C51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。”)
- .判断 (写到文件 (AB, AD) = 假)
- 输出文本 (“A51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。”)
- .判断 (写到文件 (C, 子字节集替换 (CD, _80FBFD, _80FBFF, , )) = 假)
- 输出文本 (“C51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。”)
- .判断 (写到文件 (A, 子字节集替换 (AD, _80FBFD, _80FBFF, , )) = 假)
- 输出文本 (“A51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。”)
- .默认
- .判断结束
- 输出文本 (“打补丁成功! 如有问题可将 .bak 文件改名还原。”)
- 返回 (0)
复制代码
方法5:使用以下应用程序修改:
keilfdfix.zip
(97.19 KB, 下载次数: 422)
|
|