无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: chenall
打印 上一主题 下一主题

grub4dos FAT分区创建文件命令(02-09 )

[复制链接]
91#
 楼主| 发表于 2010-1-31 18:33:47 | 只看该作者
这个理论上很很单,双目运算都是一样的。

求余%,移位>>,等。

明天再尝试一下。
回复

使用道具 举报

92#
 楼主| 发表于 2010-2-1 14:55:14 | 只看该作者
简单的实现了5则运算
+,-,*,/,%

为了编程的方便。

只能进行双目运算。

只使用一个内存地址,(只能处理32位整数)

基本上够用。

使用方法

calc ADDR 符号 数值

符号可以使用
++
--
以上两个符号后面的数值没有使用。
+=
-=
*=
/=
%=

calc.rar

586 Bytes, 下载次数: 34, 下载积分: 无忧币 -2

回复

使用道具 举报

93#
 楼主| 发表于 2010-2-1 15:42:29 | 只看该作者
呵呵,

因为是作为一个算术公式去考虑的。



a = a +2 相当于 a += 2

只是这里a使用的是一个地址。

方便以后扩展为使用两个地址吧。

汗,,跑题了。。

[ 本帖最后由 chenall 于 2010-2-1 15:46 编辑 ]
回复

使用道具 举报

94#
发表于 2010-2-1 17:38:54 | 只看该作者
原帖由 NicTense 于 2010-2-1 16:11 发表
calc出错了
数值N被忽略,永远等于1

另外就是最好能把运算结果同时作为函数返回值
以便checkrange调用,这个应该是增加一行代码而已


我这里测试正常啊

Snap1.jpg (33.17 KB, 下载次数: 135)

Snap1.jpg
回复

使用道具 举报

95#
发表于 2010-2-1 17:58:03 | 只看该作者
我晕.....我没把字看清楚
我以为操作符支持 + - * / %
所以才不明白还要 +=那些干什么
结果测试的时候符号就用了 + - * /了
那就没问题了,我把那楼删了

c大能不能把运算结果同时作为函数返回值
以便checkrange调用,这个应该是增加一行代码而已

要是2个地址,像这个功能就很容易实现了

比如 0x829c的地址只要2位,但是read出来的是4位,后面2位是ffff,我又不确定那4位什么情况下会变

calc 0x829c 0x60000 /=0x10000

就解决了

[ 本帖最后由 NicTense 于 2010-2-1 18:21 编辑 ]
回复

使用道具 举报

96#
 楼主| 发表于 2010-2-1 18:27:46 | 只看该作者
ok,
完善了一下。

1.结果作为程序的返回值

2.添加>> << & ^ | 运算符。

3.重新定义了命令行参数。

如果第一个参数没有带*则只作运算不写内存。

例子 
calc 1 + 1 或calc 1++
得到2
calc 1 + *0x8290

把内存0x8290的值+1,然后直接返回。

calc *0x60000 = *0x8290 + 2

读取内存值*0x8290加2后的值写入到*0x60000地址。

如果前面的*0x60000 是没有带*的则第一个参数被忽略(即不写内存);

calc *0x60000 + 2
计算并写内存到*0x60000处。

总之,只要第一个参数前导*的就有写内存,没有就不写内存。
并且前导*代表这是一个内存地址,否则按正常数值处理。

注:此版因为重写了代码不再支持上一个版本的+=或-=。
上个版本的+=2

用这个版本直接+2就可以了。

试下如果没有问题,就麻烦你们写个帮助文件了。^_^,我英文不行。不知如何表达。

[ 本帖最后由 chenall 于 2010-2-1 18:37 编辑 ]

calc.rar

708 Bytes, 下载次数: 23, 下载积分: 无忧币 -2

回复

使用道具 举报

97#
 楼主| 发表于 2010-2-1 18:33:18 | 只看该作者
另外,
比如 0x829c的地址只要2位,但是read出来的是4位,后面2位是ffff,我又不确定那4位什么情况下会变

calc 0x829c 0x60000 /=0x10000

就解决了

用移位比较快,只要把后面的FFFF移掉就OK了
一个ff是8位。

calc *0x60000 = *0x829c >> 16

calc 1 = *0x829c >> 16

只作计算,不写内存。

对了,请版主看到本贴的话,把后面CALC.部份转移到新贴中,免得乱了。。

[ 本帖最后由 chenall 于 2010-2-1 18:36 编辑 ]
回复

使用道具 举报

98#
发表于 2010-2-1 19:09:11 | 只看该作者

回复 #98 chenall 的帖子

这个版本比我原来想象的还要好

虽然用法完全明白了,但是帮助文件很难写

别说英文了,要写个言简意赅,符合规范的中文帮助都有点难度

这个参数表达式估计得参考一下c的英文help了
回复

使用道具 举报

99#
 楼主| 发表于 2010-2-1 19:40:17 | 只看该作者
简单使用说明:GRUB4DOS 简单双目计算器.
使用方式
1.calc 数值 [运算符] 数值
2.calc 数值 = 数值 运算符 数值
如果数值前面有前导*代表这是一个内存地址,
计算时会从这个内存地址中读取32位整数进行计算.
第一个参数如果有前导*,会将计算结果写入这个内存地址中.
可使用运算符列表:
递减 --
递增 ++
加法 +
除法 /
取余 %
乘法 *
减法 -
按位与 &
按位或 |
按位异或 ^
按位左移 <<
按位右移 >>

[ 本帖最后由 chenall 于 2010-2-1 19:43 编辑 ]
回复

使用道具 举报

100#
发表于 2010-2-1 23:37:18 | 只看该作者
支持一下,希望越来越完善.
回复

使用道具 举报

101#
发表于 2010-2-2 01:16:28 | 只看该作者
原帖由 chenall 于 2010-2-1 19:40 发表
简单使用说明:GRUB4DOS 简单双目计算器.
使用方式
1.calc 数值 [运算符] 数值



这个中括号是不是扩错地方了

calc 数值 运算符 [数值]

是不是应该是这样才对

这个数值翻译过来用 NUMBER 还是 INTEGER?
回复

使用道具 举报

102#
 楼主| 发表于 2010-2-2 01:24:12 | 只看该作者
发贴的时候本来是都有[]的,但这个是对*的,好像论坛discuz代码自动转换掉了,

自己写了一个帮助意思应该差不多,呵呵

http://www.chenall.com/blog/2010/02/grub4dos_calc.html

[ 本帖最后由 chenall 于 2010-2-2 01:25 编辑 ]
回复

使用道具 举报

103#
发表于 2010-2-2 03:03:55 | 只看该作者


The OPERATOR can be any one of the following operators:

++ --      increment and decrement
+ - * / %  arithmetic operators
<< >>      bitwise left shift and right shift
& | ^      bitwise AND,OR and XOR

If the prefix character * is specified,the calc will treat INTEGER as a memory address and get value from it.

If the * prefixed to the first INTEGER is specified,the calc will also write the result to memory address INTERGER,or just return the result value.


中文版本:

OPERATOR可以是以下操作符的任何一个:

++ --      递增 递减
+ - * / %  加 减 乘 除 求余
<< >>      按位左移 按位右移
& | ^      按位与 按位或 按位异或

如果INTEGER指定了前置符*,则calc将其视为一个内存地址并从该地址取值。

如果第一个INTEGER指定了前置符*,calc会将运算结果写入其指向的内存地址,否则,只返回运算结果。


以上为修定结果,你看看行不行

今天仔细看了一下几个外部程序的源代码
发现原来也没有之前想象的那么复杂,完全看不懂的那些行似乎都是固定的
这样看来,有些外部命令我应该是可以自己写一下的

另外

fat file copy 和fat file create 加个file有什么特殊的因素吗
如果没有
改成 fat copy 和fat create 是不是更加简单明了

[ 本帖最后由 NicTense 于 2010-2-2 05:40 编辑 ]
回复

使用道具 举报

104#
 楼主| 发表于 2010-2-2 07:58:38 | 只看该作者
谢了,回头再修正下。

写外部命令,本来就很简单啊。呵呵。只要懂点c就行。
回复

使用道具 举报

105#
发表于 2010-2-2 09:04:06 | 只看该作者
calc help还没。另望其他外部命令的帮助都补齐。发觉内部命令好多也没帮助。

C大,什么时候开课讲一讲内存中哪些是固定常量及固定常量代表的含义,如0x8280、0x829c

[ 本帖最后由 zhaohj 于 2010-2-2 09:07 编辑 ]
回复

使用道具 举报

106#
发表于 2010-2-2 09:37:16 | 只看该作者

回复 #107 zhaohj 的帖子

这个看附带的readme_grub4dos.txt文件
回复

使用道具 举报

107#
发表于 2010-2-2 09:37:27 | 只看该作者
104#已经修正了,返回值也正确了。返回值可以传递给checkrange.

问一下,返回值放在哪个内存地址?

[ 本帖最后由 zhaohj 于 2010-2-2 09:50 编辑 ]
回复

使用道具 举报

108#
发表于 2010-2-2 09:48:19 | 只看该作者
原帖由 NicTense 于 2010-2-2 09:37 发表
这个看附带的readme_grub4dos.txt文件


只看到这些,应该还有内部的变量:

在固定位置访问一些内部变量
Address        Length        Description
地址            长度            说明
=========    ========    ==============================================
0000:8208    4 (DWORD)    install_partition (the boot partition)
                4字节(即双字) 启动分区号

0000:8280    4 (DWORD)    boot_drive (the boot drive)
                4字节(即双字) 启动驱动器号

0000:8284    4 (DWORD)    pxe_yip (your ip)
                4字节(即双字) pxe 客户端 ip (即本地ip)

0000:8288    4 (DWORD)    pxe_sip (server ip)
                4字节(即双字) pxe 服务器 ip

0000:828C    4 (DWORD)    pxe_gip (gateway ip)
                4字节(即双字) pxe 网关 ip

0000:8290    8 (QWORD)    filesize (file size by last "cat --length=0")
                8字节(即四字)   最后访问的文件的大小(是执行"cat --length=0"后的文件大小)

0000:8298    4 (DWORD)    saved_mem_upper (extended memory size in KB)
                4字节(即双字) 可用的扩展内存大小( 扩展内存大小以 KB 为单位 )

0000:829C    4 (DWORD)    saved_partition (current root partition)
                4字节(即双字) 当前根分区号

0000:82A0    4 (DWORD)    saved_drive (current root drive)
                4字节(即双字) 当前根所在的驱动器

0000:82A4    4 (DWORD)    no_decompression (no auto gunzip)
                4字节(即双字) 未解压大小 (gzip非自动解压)
回复

使用道具 举报

109#
发表于 2010-2-2 10:12:03 | 只看该作者

回复 #110 zhaohj 的帖子

貌似只有这些了,还有0x60000开始的2个扇区的自定义数据
其他地址估计也不会公布了,如果是程序运行时间的内部参数,作者也不希望别人去乱改他们
回复

使用道具 举报

110#
 楼主| 发表于 2010-2-2 10:41:48 | 只看该作者
是的。基本上就这些,但是对于外部命令可以访问更多具体可以看下grub4dos.h文件
回复

使用道具 举报

111#
发表于 2010-2-2 14:38:45 | 只看该作者
我想到一个不用修改原来任何命令就能够实现动态参数的方案了
我先试试自己写一下外部命令,不过我有10年没写过c了,都忘光了,
而且grub的内部函数也都不了解,得重新学习一下
回复

使用道具 举报

112#
 楼主| 发表于 2010-2-2 15:24:07 | 只看该作者
我正在尝试写一个WENV命令

可以设置,保存,读取变量.

并且通过这个命令执行的,可以使用设置变量.


wenv set a=1234
wenv run read $a
最终执行的是
read 1234
回复

使用道具 举报

113#
 楼主| 发表于 2010-2-2 17:18:04 | 只看该作者
我是用colinux + debian 5.0编译的.

debian是用的之前时空的那个.

需要的话我再传一个到网盘上.几百MB.解压后1G多一点.
回复

使用道具 举报

114#
发表于 2010-2-2 17:21:12 | 只看该作者
原帖由 chenall 于 2010-2-2 15:24 发表
我正在尝试写一个WENV命令

可以设置,保存,读取变量.

并且通过这个命令执行的,可以使用设置变量.


wenv set a=1234
wenv run read $a
最终执行的是
read 1234


这个变量应该是全局变量,会被GRLDR所设别。如:
wenv set a=24
map --mem ()\CSPE\KERNEL\GRUB.MOD ($a)
回复

使用道具 举报

115#
发表于 2010-2-2 17:50:53 | 只看该作者

回复 #116 chenall 的帖子

一定要到linux里面才能编译吗,包括虚拟机加载linux

有没有puppy或者cdlinux下能用的编译器呢

[ 本帖最后由 NicTense 于 2010-2-2 19:33 编辑 ]
回复

使用道具 举报

116#
发表于 2010-2-2 19:34:39 | 只看该作者

回复 #117 zhaohj 的帖子

这是不可能的
你没弄明白外部命令的含义
外部命令再怎么牛,也不可能让内部命令在不修改代码的前提下,实现原来不支持的功能阿

所以只能用外部命令把动态参数通过调用内部命令的方式传给内部函数
回复

使用道具 举报

117#
 楼主| 发表于 2010-2-2 20:05:10 | 只看该作者

回复 #118 NicTense 的帖子

外部命令编译比较容易,只要有装GCC就可以编译了.

因为是ELF格式,所以WIN下的GCC编译出来的不能使用,我不懂得如何处理,否则直接在WIN下编译就简单多了.

你可以试下.

刚传到一半就挂了,又得重传,你先自己找个LINUX带gcc的试一下.不行我再传,网速太慢了.

[ 本帖最后由 chenall 于 2010-2-2 20:08 编辑 ]
回复

使用道具 举报

118#
发表于 2010-2-2 21:03:04 | 只看该作者

回复 #120 chenall 的帖子

上传不了就算了,如果gcc就可以,我去下载个for puppylinux或者cdlinux的gcc试一下好了
反正目前我也写不出什么程序来,先写个 第一个硬盘map到最后,其他依次前移的命令好了
哈哈,这个,应该一个for命令就够了
回复

使用道具 举报

119#
发表于 2010-2-2 23:13:21 | 只看该作者
原帖由 NicTense 于 2010-2-2 19:34 发表
这是不可能的
你没弄明白外部命令的含义
外部命令再怎么牛,也不可能让内部命令在不修改代码的前提下,实现原来不支持的功能阿

所以只能用外部命令把动态参数通过调用内部命令的方式传给内部函数


外部命令当然不可能,我是说这么重要的命令做成内部命令让全局都能识别岂不更好?!
让GRUB4DOS能设置全局变量一直是多少人的愿望啊!
回复

使用道具 举报

120#
发表于 2010-2-3 00:15:23 | 只看该作者

回复 #122 zhaohj 的帖子

做成内部命令也不会是全局变量
关键是,原来的函数根本就不会识别变量
如果要实现你说的功能,那就意味着原来所有有参数的函数都要重写
工程大,容易出错
还会造成版本不同之间的兼容性问题

其实有wenv,calc就差不多了,最多加个for
然后基本上就能实现编程了

zhaohj只能寄希望于0.5.x了,要内部命令支持变量,那需要修改几十个内部命令的代码

等c大一个一个外部命令写好,哪天突发奇想回头把所有内部命令都改了,那就有可能了

或者不点大大有兴趣改,那也不是问题了

[ 本帖最后由 NicTense 于 2010-2-3 02:12 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-9-23 10:25

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表