
汇编
z974656361
这个作者很懒,什么都没留下…
展开
-
cmpxchg指令
CMPXCHG—比较并交换操作码指令说明0F B0/rCMPXCHG r/m8, r8比较AL与r/m8。如果相等,则设置ZF,并将r8加载到r/m8,否则清除ZF,并将r/m8加载到AL。0F B1/rCMPXCHG r/m16, r16比较AX与r/m16。如果相等,则设置ZF,并将r16加载到r/m16,否则清除ZF,并将r/m16加载到AL。0F B2/rCMPXCHG r/m32, r32比较EAX与r/m32。如果相等,则设置ZF,并将r32加载到原创 2020-11-10 21:11:58 · 1849 阅读 · 0 评论 -
跳转(jmp)指令
跳转指令正常执行的情况下,指令按照它们出现的顺序一条一条地执行。跳转(jmp)指令会导致执行切换到程序中一个全新的位置。在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。考虑下面的汇编代码序列:movq $0, %raxjmp .L1movq (%rax), %rdx.L1: popq %rdx指令jmp .L1会导致程序跳过movq指令,而从popq指令开始继续执行。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部原创 2020-11-08 12:49:02 · 8578 阅读 · 0 评论 -
比较和测试指令
比较和测试指令1.条件码除了常用的整数寄存器,CPU还维护着一组单个位的条件码寄存器,他们描述了最近的算术或逻辑操作的属性。这个寄存器在X86CPU内部的名称叫做EFLAGS,在x86-64CPU内部扩展成RFLAGS。最常用的条件码标志有:CF:进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出。ZF:零标志。最近的操作得出的结果为0.SF:符号标志。最近的操作得到的结果为负数。OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。2.比较指令CMP指令根据两原创 2020-11-08 12:48:18 · 1271 阅读 · 0 评论 -
X86-EFLAGS寄存器
EFLAGS寄存器32位的EFLAGS寄存器由一组状态标志位、一个控制标志位和一组系统标志为组成。该寄存器内的标志位如下图所示:在处理器的初始化完成以后,EFLAGS寄存器的值是0000002H。第1、3、5、15以及22到31位均被保留着,软件不应该使用或者依赖这些位的状态值。这个寄存器中的有些标志位可以通过使用特殊目的的指令直接修改,但是并没有指令能够直接修改或检查整个寄存器。通过使用LAHF/SAHF/PUSHF/POPF/POPFD等指令,可以将EFLAGS寄存器的标志位成组移动到程序原创 2020-11-07 22:47:18 · 550 阅读 · 0 评论 -
GCC的内嵌汇编语法
GCC的内嵌汇编语法AT&T ASM Syntax1.Overview2.Syntax1.寄存器引用2.操作数顺序3.立即数4.符号常数5.操作数的长度6.符号扩展和零扩展指令7.跳转指令8.前缀9.内存引用3.GCC Inline ASM1.基本内联汇编1.\_\_asm\_\_2. Instruction List3.\_\_volatile\_\_2.带有C/C++表达式的内联汇编1.Output2.Input3.Operation Constraint1. 寄存器约束2. 内存约束3. 立即原创 2020-11-07 11:48:53 · 734 阅读 · 0 评论 -
AT&T汇编——算术和逻辑操作
算术和逻辑操作算术和逻辑操作加载有效地址一元操作二元操作移位操作特殊的算术操作算术和逻辑操作加载有效地址指令效果描述leaq S,DD←&SD \leftarrow \&SD←&S加载有效地址加载有效地址指令leaq实际上是movq指令的变形。它的指令形式是从内存读取数据到寄存器,但实际上它根本没有引用内存。它的第一个操作数看上去是一个内存引用,但该指令并不是从指定的位置读入数据,而是将有效地址写入到目的操作数。这条指令可以为后续的内存原创 2020-07-27 22:27:05 · 1230 阅读 · 0 评论 -
AT&T汇编——压入和弹出栈数据
压入和弹出栈数据数据的入栈和出栈数据入栈指令数据出栈指令数据的入栈和出栈栈在处理函数调用过程中起到至关重要的作用。栈是一种数据结构,可以添加或删除值,不过要遵循后进先出的原则。通过push操作把数据压入栈中,通过pop操作删除数据。它具有一个属性:弹出的值永远是最近被压入而且仍然在栈中的值。栈可以实现为一个数组,总是从数组的一端插入和删除元素。这一端被称为栈顶。在x86-64中,程序栈存放在内存中某个区域。栈向下增长,这样一来,栈顶元素的地址是所有栈元素地址中最低的。栈指针%rsp保存着栈原创 2020-07-05 09:02:45 · 806 阅读 · 0 评论 -
AT&T汇编——MOV指令
AT&T汇编——MOV指令MOV类指令MOVZ类指令MOVS类指令MOV类指令MOV类指令是最简单的数据传送指令,这类指令把数据从源位置复制到目的位置,不做任何变化。MOV类指令由四条指令组成:movb、movw、movl和movq。这些指令都执行同样的操作:主要区别在于它们操作的数据大小不同:分别是1、2、4和8字节。指令效果描述MOVS,DMOV S,DMOVS,DD<−SD <- SD<−S传送movbmovbmovb传送字节原创 2020-07-05 08:32:18 · 12252 阅读 · 0 评论 -
AT&T汇编的寻址方式
AT&T汇编的寻址方式立即数寻址寄存器寻址内存寻址大多数指令有一个或者多个操作数,指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。x86-64支持多种操作数格式。源数据值可以以常数形式给出,或者是从寄存器或内存中读出。结果可以存放在寄存器或内存中。立即数寻址在AT&T汇编中,立即数用来表示常数值。立即数的书写方式是$后面跟随一个用标准C表示法表示的整数。不同的指令允许的立即数值范围不同,汇编器会自动选择最紧凑的方式进行数值编码。寄存器寻址寄存器寻址主要是根据寄存原创 2020-07-04 19:23:49 · 1909 阅读 · 0 评论 -
x86-64中的寄存器
x86-64CPU中的寄存器64位CPU中的寄存器32位CPU中的寄存器16位CPU中的寄存器8位CPU中的寄存器64位CPU中的寄存器x86-64CPU中共有16个存储64位值的通用目的寄存器,这些寄存器用来存储整数数据和指针。64位CPU的前8个寄存器是从32位CPU中的%eax到%esp的8个寄存器,从32位扩展为64位,同时,名称也变为了从%rax到%rsp。另外的8个寄存器是新增的,标号从%r8到%r15。标号作用%rax返回值%rbx被调用者保存%r原创 2020-07-04 16:25:29 · 6077 阅读 · 0 评论 -
ATT汇编学习笔记——数据格式
ATT汇编的数据格式X86-64汇编的数据格式X86-64汇编的数据格式C声明Intel数据类型汇编代码后缀大小(字节)char字节b1short字w2int双字l4long四字q8char*四字q8float单精度s4double双精度l8因为Intel处理器的体系结构是从16位扩展到32位的,Intel用术语字(word)表示16位数据类型,双字(double words)表示32位数据类型,原创 2020-07-04 15:37:13 · 448 阅读 · 0 评论