Jan 5, 2011

有意思的lea指令

最近恶补汇编时发现lea指令很有意思, 但大部分书都把它一笔带过, 同时网上的资料又很少, 所以记一下.

lea, load effective address, 加载有效地址. 指令形式是从存储器读数据到寄存器, 效果是将存储器的有效地址写入到目的操作数, 简单说, 就是C语言中的”&”.

例如在32位环境下, 有内存位置标签foo, 则下面两行效果相同:

movl $foo, %edi
leal foo, %edi

同时, lea还有个很有用但同时又很难理解的用法, 例如这样:

leal 5(%edx, %edx, 2), %eax

假设%edx的值为x, 上面这行会将%eax的值设置为”3x+5”.

奇怪吧, 一个取址的指令怎么用来做简单算术操作了? 其实理解起来也不难, 5(%edx, %edx, 2)是存储器”3x+5”这个地址中的值, 这个值作为leal的源操作数会被取地址, 地址是什么? 自然就是”3x+5”!

值得注意的是, 不管是AT&T还是Intel语法, lea都是加载有效地址, 所以运算结果需得在地址空间能表示的大小范围内.

PS: 可能有人会问为什么不把源操作数写成5(, %edx, 3), 这个嘛, 因为这种寻址模式的比例因子只能是1, 2, 4或者8.


Jan 1, 2011

2010年

2011年, 毫无惊喜得来了.

过去的2010年, 快乐的记忆很多, 痛苦的片段也不少, 正如狄更斯老师说的, it was the best of times, it was the worst of times. 这一年, 我没法打上”后悔”或者”不后悔”的标签, 即使再给我一次机会, 我也不知道应该如何度过.

往者不可谏, 来者犹可追. 希望新的一年里, 我能过得简简单单的, 也希望大家, 每个人, 都能幸幸福福, 快快乐乐的.


Dec 24, 2010

批量重命名脚本

我一直在找这样一个批量重命名脚本: 原扩展名不变, 文件名从小到大, 以01, 02这种数字排序命名. 这么简单的功能却一直没找到相应的脚本, 只好自己写了一个, 可以预览, 没有覆盖危险, 并可以自动判断位数, 如下:

#!/bin/sh

NUM=1
TOTAL_NUM=$[`ls -l |grep ^- |wc -l` - 1]
LENGTH=`echo $TOTAL_NUM |awk '{print length($0)}'`

if [ "$1" == "-f" ]
then
	TEMP_DIR=`mktemp -d .tmp.XXXXXXXXXX` || exit 1
fi

for orig in `ls -S -r`
do
	if [ ! -f "$orig" ]
	then
		continue
	fi
	EXT=${orig##*.}
	echo ""`printf %0.${LENGTH}d $NUM`.$EXT"   <--   "$orig""
	if [ "$1" == "-f" ]
	then
		mv "$orig" "${TEMP_DIR}/`printf %0.${LENGTH}d $NUM`.$EXT"
	fi
	NUM=$[$NUM + 1]
done

if [ "$1" == "-f" ]
then
	mv ${TEMP_DIR}/* ./
	rmdir $TEMP_DIR
else
	echo
	echo "Use $(basename "$0") -f to make it effective"
	echo
fi

exit 0

PS: Win下可以用Total Commander中的批量重命名功能, 全平台包括Linux的可以选Métamorphose 2, 暂时只发现这两个软件可以满足我的需求, 但是一个懒得Wine, 一个嫌功能太多而且体积有点大.


Dec 24, 2010

提取Flash视频的脚本

Adobe邪恶了…

以前在Linux下提取Flash视频很容易, 只要去/tmp下找Flash开头的文件保存就好, 但是最近几个版本的Flash插件却找不到这些缓存文件了.

研究了一下, 发现这些文件其实还是在/tmp下, 但是文件建立打开之后inode却被删掉了, 所以不可见, 确实有点邪恶吧? 但是既然文件是打开的状态, lsof就肯定能看到, /proc中就肯定有它的文件描述符, 剩下的事情比较容易, 脚本如下:

#!/bin/sh

DESTDIR="${HOME}/Videos/Flash"

if [ ! -d "$DESTDIR" ]
then
	mkdir -p $DESTDIR || exit 1
fi

LINES=`lsof |grep '/tmp/Flash[^ ]*'`

IFS=$'\n'

for i in $LINES
do
	FILE=`echo $i |awk '{print "/proc/" $2 "/fd/" $4}' |sed 's/[rwu]$//'`
	NAME=`echo $i |awk '{print $9}' |awk -F '/' '{print $3}'`

	cp $FILE ${DESTDIR}/${NAME}.flv
done

exit 0

这里面的目标存放文件夹我指定的是~/Videos/Flash, 如果想放到别的地方, 改DESTDIR这个变量就好.

另外, 这个脚本很简单, 但是写的过程中我也学到了一个小技巧, 就是IFS(Internal Field Separator)这个变量, 这个变量告诉了shell在处理字符串时如何判断一个词, 默认值是空格, Tab和换行, 我把它给设置成了只有换行, 因为我想在后面的for循环中每次处理一行而不是一个词.


Nov 30, 2010

We are the best

太棒了, 巴塞罗那 5: 0 皇家马德里.

巴萨节奏太畅快了, 传球倒脚又快又准, 这是赢球的关键.

皇马也并不如比分上看起来那么不堪, 估计有点发懵, 那么快的防守反攻没能坚持, 闪现了两下就没了踪影.

总之, 巴萨赢得痛快!

PS: 虽然我是巴萨迷, 但是对皇马一直怀有敬意. 只是C罗, 人品也太差了吧, 场上丢人暂且不说, 这会儿, 估计又在埋怨队友没有给”世界第一”的他创造机会呢.


Nov 17, 2010

弃用QQ

终于停用了QQ.

原因嘛, 它让我的生活太闹腾了, 而且绑架用户, 监控通信等等行为对我来说也是无法接受的.

需要解释的是, 我弃用QQ和近期所谓的3Q大战并没有关系, 只是时间上赶巧了, 这次”参战”的流氓软件和流氓网站我都没有用.

总之, QQ不用了, 联系方式在这里. 我平时比较忙, 也不太健谈, 所以请尽量不要直接发Gtalk邀请, 有事儿就给我发邮件 : )

PS: QQ不提供注销功能, 但是可以像我一样把资料清空, 好友清空(拉黑再删可以从对方好友列表中消失), 密码和密码保护改成记不得的乱码, 这样过个几个月或者几年没登录, 号码也就被回收了, 世界也终究会归于清静.


Nov 14, 2010

用Vim批量重命名

今天发现了一个好玩儿的东西, Vim的插件, renamer.

使用方法很简单, 只要在目标文件夹下打开Vim, :Renamer就可以了, 它会把当前文件夹下的所有文件名放到Vim的buffer中, 然后你想怎么改怎么改, 改完了用:Ren使其生效.

我很喜欢这个插件, 同时推荐Vi控和键盘控试一下, 相信你不会后悔的.

PS: 据说, Emacs中dired的Immediate Edit File Names是一样的东西.


Oct 30, 2010

第一个patch

今天很高兴, 我第一次提交patch就被接受了.

事情是这样的: 前几天在挑图片浏览软件, 试用Qiv的过程中, 感觉几个地方不是很如意, 就看了下代码, 顺手打了个patch.

补丁在这里, 很简单, 十几行代码的事情. 未打补丁之前, 开启browser模式时, 参数里的文件会被显示两次; 开启了browser模式又没有指定排序模式的情况下, 参数中文件显示完之后会跳转到文件列表中的第一个而不是参数中文件在列表里的下一个. 打完patch之后应该用起来会比较顺手.

这个修改会体现在Qiv 2.2.4版本中, 希望能给用Qiv的朋友带来方便.

PS: 我后来并没有用Qiv而是选了Mirage, 之前用的是Geeqie.


Oct 20, 2010

用ftp互传文件

不知道大家都是怎么解决局域网内文件互传的, IPMsg(飞鸽传书)没有完美的Linux实现, Samba和NFS跨平台不好, Python的SimpleHTTPServer又不支持批量和文件夹. 所以在我看来, 最方便, 最快捷, 支持批量和文件夹, 跨平台最好的肯定是ftp.

我选择的ftp服务器是vsftpd, 最后实现的结果是, 匿名且不需用户名和密码登录, 指定我自己的一个目录作为ftp根目录, 权限操作无障碍. 不错吧, 且看配置/etc/vsftpd.conf:

write_enable=YES
anonymous_enable=YES
no_anon_password=YES
anon_root=/path/to/share
anon_umask=000
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

注意, vsftpd要求anon_root这个目录不能是777的权限, 所以我在它下面又建立了一个777权限的upload目录, 在upload下匿名ftp用户拥有一切权限. 还有, anon_root和其下的upload所有者都是我, 但是别人传上来的文件所有者都是ftp, 操作很不方便, 所以我把anon_umask设置为了000.


Oct 14, 2010

配置Touchpad

为了彻底抛弃对于鼠标的依赖, 这几天先是改用了Awesome, 又手动打开了新版xorg(after 7.4)默认不开启的触摸板点击(tapping)功能.

好消息是: 用于触摸板的synclient和syndaemon不再需要开启SHMConfig选项了. 所以只要在.xinitrc中加入下面两行就能满足我的需求:

synclient TapButton1=1
syndaemon -i 2 -k -d &

第一行是启用点击, 第二行是用来防止敲击键盘时不小心碰到触摸板. 详细说明和方法请参考manual.

另外, 如果想通过xorg.conf来配置, 较简单的方法是使用子配置目录以及用Match匹配设备的InputClass段, 例如:

/etc/X11/xorg.conf.d/50-synaptics.conf

Section "InputClass"
	Identifier "Touchpad"
	MatchIsTouchpad "on"
	Driver "synaptics"
	Option "TapButton1" "1"
	Option "TapButton2" "2"
	Option "TapButton3" "3"
	Option "VertEdgeScroll" "true"
	Option "HorizEdgeScroll" "true"
EndSection