汇编指令表#
注:MIT6.828 使用的是 AT&T 语法。AT&T 语法始终将 src
放在左侧,dest
放在右侧。
在汇编指令中,我们注意到 mov
指令不仅有 mov
,还有 movb
、movw
、movl
、movq
。
那么它们有什么区别呢?这里的后缀 b
、w
、l
、q
是 AT&T 语法中的限定词:
q
:四字(8 个字节,64 位)l
:双字(4 个字节,32 位)w
:单字(2 个字节,16 位)b
:单字节(1 个字节,8 位)
特殊情况:ljmp
中的 l
不是后缀,而是前缀,但大概意思没有变,因此这种略微的差异并不影响我们阅读代码。
ljmp
表示能够跳转到比 jmp
更远的地方,而且为了存储 ljmp
需要占用的内存空间更大。
记住一些约定,对我们理解汇编源代码有一定的好处 1https://binhack.readthedocs.io/zh/latest/assembly/diff.html:
在 AT&T 语法中,前缀
%
后紧接寄存器名,前缀$
后是立即数;在 Intel 语法下,寄存器名和立即数前都没有前缀;
AT&T 中的内存寻址采用的是
()
,Intel 内存寻址使用的是[]
。
但情况也有例外,比如 out %ax,$0x64
是一个输出语句,这里的 $0x64
就不能看作一个立即数了,它表示一个端口,因此这句话的意思是将 ax
寄存器中的内容输出到
0x64
对应的设备中。
传送指令#
汇编指令 |
控制 CPU 完成的操作 |
备注 |
---|---|---|
|
将 18 送入寄存器 |
|
|
将寄存器 |
函数调用 |
|
将 |
函数返回 |
|
2http://adam8157.info/blog/2011/01/interesting-opcode-lea将 |
载入有效地址 |
转移指令#
汇编指令 |
控制 CPU 完成的操作 |
备注 |
---|---|---|
|
执行 |
函数调用 |
|
执行 |
无条件跳转 |
|
执行 |
标志位 |
|
执行 |
标志位 |
|
执行 |
如果小于则跳转 |
|
执行 |
如果不小于则跳转 |
|
执行 |
如果大于则跳转 |
|
执行 |
如果不大于则跳转 |
运算指令#
汇编指令 |
控制 CPU 完成的操作 |
备注 |
---|---|---|
|
将 |
|
|
将 |
|
|
将累加器 |
|
|
将 |
|
|
将 |
带进位相加 |
|
将 |
带借位相减 |
|
比较立即数 |
设置标志位 |
|
将 |
开启位 |
|
将 |
关闭位 |
|
将寄存器 |
求反位 |
|
测试 |
|
|
如果 |
|
控制指令#
3https://www.cnblogs.com/fatsheep9146/p/5115086.htmlNote
串操作的含义就是连续的一串相同的操作,通常作用在连续的内存上。 比如把一串字符串常量送入到某个连续地址处,此时如果采用串操作的话,每传一个字节的数据, 串操作可以自动的把源操作数和目的操作数的地址加或减 1。 那么下一个操作就直接作用在下一个空间了 3https://www.cnblogs.com/fatsheep9146/p/5115086.html。
汇编指令 |
控制 CPU 完成的操作 |
备注 |
---|---|---|
|
白白消耗 CPU 的时钟周期,什么都不干 |
延时操作 |
|
关中断指令 |
保证操作的原子性 |
|
方向标志位清零: |
|
|
4https://bochs.sourceforge.io/techspec/PORTS.LST把 |
CPU 与外部设备通信 |
|
把端口 |
CPU 与外部设备通信 |
|
5http://wiki.osdev.org/Interrupt_Descriptor_Table将从 |
进程间切换 |
|
将从 |
保护模式下的隔离措施 |
以上是常用的汇编指令,如果想要查看更多详细的介绍,可以参考 PC 汇编语言 的 附录A 80x86 指令。