前面讲解了一些简单的基本指令的应用。(前期的废话可以省略👀,当作没有看见,小编跪求😭。。。。。 不当做没有看见,也没有关系,小编不在乎!😭😭)
特殊算数指令
imull和mull
这里不同正常乘法的双目操作符
初看是一坨屎,看不懂去看书,看书像在看天书,讲的是这个内容!
其实非常简单,imull执行的是有符号的乘法,而mull执行的无符号的乘法。
imull S的意思就是让S与%eax寄存器进行🈶️符号位乘的出的二进制位(64位的),高位放到寄存器%edx上面,地位放到%eax上面。
mull S的意思就是让S与%eax寄存器进行无符号位乘的出的二进制位(64位的),不过不相同的是乘法不同种类,高位(32位)放到寄存器%edx上面,底位(32位)放到%eax上面。
cltd
简单的将%eax寄存器的值符号扩展32位到%edx寄存器,
也就是说,如果%eax寄存器的二进制序列的最高位为0,
则cltd指令就把%edx置为32个0,相反,
如果%eax寄存器的二进制序列最高位为1,
则cltd指令将会自从填充%edx寄存器为32个1.
divl 和 idivl
都是让%eax除以S,然后得到的商储存在%eax中,余数储存在%edx中。其中还有一个差别,一个是有符号的运算,一个是无符号的运算。
进行位置控制的指令
cmp S M
通过两个条件的差值来设置条件码,如果相同的为一(条件码)。如果其他的条件会有不同的条件码。
关于条件码,
我的另一篇文章上面有全部内容。
test S M
两数进行逻辑与的运算,得到结果,结果改变条件码的值。(测试不同具体的值)
访问条件码
方式:
1. 根据某一个组合,将条件码设置为0或者1。
2. 用于条件的判断,从而决定执行的位置信息。
3. 进行数据的传输
具体的用法,判断条件(条件码)是否都正确,如果都正确让8位寄存器都为1,否则为0。
例子
sete %al
如果条件寄存器的到的为ZF(表示0),让%al寄存器全部都充满1(及结果正确)。
其他的set类型也是相同的方法。
跳转指令编码
jmp Label 和*Operand
直接跳转到具体的下一个位置不需要具体的条件。
条件跳转
满足具体的条件码的情况,跳转到具体的位置(和if条件语句差不多)!
汇编语言到此为止结束了。如果以后我学习到了相关内容这里面没有涉及的内容,以后我会不断的更新在这一个板块。