“.”开头的行都是指导汇编器和链接器的命令,我们通常可以忽略这些行。
INC 自增1 increase
DEC 自减1 decrease
JGE 前>=后 Jump if not greater or equal
JG 前>后 Jump if not greater
JLE 前<=后 Jump if not less or equal
JL 前<后 Jump if not less
JNE 前不等于后 Jump if not equal
JE 前等于后 Jump if equal
cmpl S2,S1 S1 – S2 比较双字,差关系
cmp(compare)指令进行比较两个操作数的大小
例:cmp oprd1,oprd2
为第一个操作减去第二个操作数,
但不影响第两个操作数的值
它影响flag的CF,ZF,OF,AF,PF
我们怎么判断大小呢?
若执行指令后
ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0
当无符号时:
若
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
很简单的一条指令,初学者看看,我感觉我写的还挺详细的,哈哈……
段寄存器: cs, ds, ss, es, fs, gs(很少使用,不用修改)
段寄存器配对:
cs:eip(代码段指针) ds:esi(数据段), es:edi, ss:esp(栈顶指针), ss:ebp(栈底指针)
.section .data
a: .int 4 定义变量a值为4
.section .bss
.lcomm b, 2 定义变量b大小为2字节
INC 自增1 increase
DEC 自减1 decrease
JGE 前>=后 Jump if not greater or equal
JG 前>后 Jump if not greater
JLE 前<=后 Jump if not less or equal
JL 前<后 Jump if not less
JNE 前不等于后 Jump if not equal
JE 前等于后 Jump if equal
cmpl S2,S1 S1 – S2 比较双字,差关系
cmp(compare)指令进行比较两个操作数的大小
例:cmp oprd1,oprd2
为第一个操作减去第二个操作数,
但不影响第两个操作数的值
它影响flag的CF,ZF,OF,AF,PF
我们怎么判断大小呢?
若执行指令后
ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0
当无符号时:
若
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
很简单的一条指令,初学者看看,我感觉我写的还挺详细的,哈哈……
段寄存器: cs, ds, ss, es, fs, gs(很少使用,不用修改)
段寄存器配对:
cs:eip(代码段指针) ds:esi(数据段), es:edi, ss:esp(栈顶指针), ss:ebp(栈底指针)
.section .data
a: .int 4 定义变量a值为4
.section .bss
.lcomm b, 2 定义变量b大小为2字节