问两个汇编语句问题(测试和CMP)

测试属于逻辑运算指令的功能:执行位之间的逻辑运算。

Test(两个操作数分别为AND,只修改标志位,不发回结果)。

Test对两个参数(目标和源)执行“与”逻辑运算,并根据结果设置标志寄存器。结果本身不会被保存。测试AX,BX和和AX,BX命令有同样的效果。语法:TEST r/m,r/m/data。

冲击符号:C,O,P,Z,S(其中C和O两个符号会设置为0)。示例:

1.Test用来测试一个位,比如寄存器:test eax,100 b;后缀b表示二进制。

jnz * * * * * *如果eax的右数第三位是1,jnz会跳转。我也这么认为jnz跳转的条件是ZF = 0,也就是说没有设置ZF(零标志),也就是逻辑与的结果是1.2。test的一个非常常见的用途是测试一个寄存器是否为空:test ecx,ecx。

Jz某处如果ecx为零,设置ZF零标志为1,JZ跳转CMP是一个算术运算指令函数:比较两个值(寄存器,内存,直接值)。

语法:CMP r/m,r/m/data

标志位:C、P、A、Z、O CMP比较。(两个操作数相减,只修改标志位,结果不发回)。

Cmp实际上是一个只设置标志而不保存结构的减法,设置Z标志(零标志)。

与进位非常相似,零标志也是内部标志寄存器中的一个位。例如:

Cmp eax,2;如果eax-2=0,即EAX = 2,则将零标志设置为1。

Jz * * * *如果置零标志,跳转到测试逻辑,运算结果为零,设置ZF(零标志)为1;

如果cmp算术减法的结果为零,则将ZF(零标记)设置为1。