条件跳转指令Jcc(Jump condition code)

关于条件跳转指令,特别是用于有符号数比较的Jcc指令,网上的文章多有讹误,这次彻底的厘清一下,以备忘。

在介绍条件跳转指令之前,介绍一下EFLAGS寄存器中的状态标志(Status Flag)是有必要的,Jcc中的cc(condition code)即表示需要测试的状态标志或状态标志组合。EFLAGS寄存器的低16位在8086时代叫做FLAGS寄存器,又称作程序状态字PSW(Program Status Word)。
Continue reading “条件跳转指令Jcc(Jump condition code)”

负数补码(two’s complement)的原理及证明

在本文里面,com指代complement, neg指代negative,并且本文涉及的是”2的补码”(two’s complement)而不是”1的补码”(one’s complement)

学过计算机的大部分人都知道负数在计算机内部是用补码表示的,但是大部分的教材和文章里面都只是简单的告诉你负数的补码等于其反码加一云云,至于为什么是这样,则基本上都语焉不详。

负数用补码表示的好处就是减法可以转化为加法,简化硬件设计,CPU只用一个加法器就可以进行加减法运算了。

下面我就尝试着来证明一下,为什么负数的补码等于反码加一。
理解下面的推导要求读者必须了解模数的概念和求模运算。
Continue reading “负数补码(two’s complement)的原理及证明”

debian:ssh安全自动登录设置

用ssh来管理远程服务器真是一件很舒适安逸的事情,当然前提是要做足安全工作,internet上可是杀机四伏啊。

记得我刚安装好Debian的时候 ,为root设置了一个很简单的密码,然后开放了ssh服务,没几天root帐号就让人给暴了, 看看/var/log/auth.log吧,真是惨不忍睹,里面全是尝试ssh登录的记录。好吧,我承认,当时是太没经验了。当然现在这种情况是一去不复返了。

下面就来说说如何提高ssh登录的安全性和自动登录ssh服务器。
Continue reading “debian:ssh安全自动登录设置”

64位运算中的REX指令前缀

64bits CPU引入了REX指令前缀。
REX前缀的主要功能有以下几点:

  • 指定通用寄存器和SSE寄存器,当然主要是来指定扩展的寄存器,如R8-R15寄存器等
  • 指定64位操作数
  • 指定扩展控制寄存器

一直以来都不知道这个REX缩写词是由哪个或哪几个单词缩写来的,今天突然想明白了,REX应该就是Register EXtension,因为REX的主要功能就是用来索引扩展寄存器的。

关于REX前缀更详细的介绍,请参考Intel® 64 and IA-32 Architectures Software Developer’s Manuals

traceroute: 使用纯真IP数据库显示中间路由器以及主机的地理位置

traceroute是常用的网络诊断和查询工具,但是通常traceroute只能显示中间路由器和主机的ip地址和主机名,如果能输出机器的地理位置是最好不过了。怎么办?重新写一个traceroute?这是windows的思路。traceroute已经足够好了,为什么要重写呢,我们只要把结果加工一下就可以了。不得不佩服UNIX的设计哲学,无疑这种正交的功能,如果硬要搀和在一起,实在是没什么必要和额外的好处。 Continue reading “traceroute: 使用纯真IP数据库显示中间路由器以及主机的地理位置”