中国住房和城乡建设网站,wordpress文章写html,南京广告公司招聘,贵州景点网站建设方案寄存器、变量#xff08;常量#xff09;与立即数
在Intel汇编中#xff0c;无论是寄存器、变量#xff08;常量#xff09;还是立即数#xff0c;都是直接使用的#xff0c;例如下列例子中分别加载一个变量#xff08;常量#xff09;与立即数到寄存器中#xff1a…寄存器、变量常量与立即数
在Intel汇编中无论是寄存器、变量常量还是立即数都是直接使用的例如下列例子中分别加载一个变量常量与立即数到寄存器中
mov eax, var ; var为已经定义好的变量常量
mov eax, 1234h在ATT汇编中使用寄存器需要在其名称前增加%例如使用eax寄存器在ATT汇编中为%eax。对于变量常量与立即数在ATT中使用需要加上$。
movl $var, %eax
movl $0x1234h, %eax指令操作数顺序
在Intel汇编中指令的格式为目标操作数在左源操作数在右。而在ATT汇编中指令的格式为源操作数在左目标操作数在右。
例如下面的例子中将eax的值加载到ebx中使用两个格式的汇编分别为
movl %eax, %ebx ; ATT
mov ebx, eax ; Intel指令字长
在ATT汇编中需要在指令后使用后缀b、w、l、q表示操作数的字长它们分别表示byte8位、word16位、longword32位与quadword64位。
下面的例子中分别在不同位数的情况下分别将al、ax、eax与rax寄存器中的值加载到bl、bx、ebx与rbx寄存器中。
; 8位
movb %al, %bl ; ATT
mov bl, al ; Intel
; 16位
movw %ax, %bx ; ATT
mov bx, ax ; Intel
; 32位
movl %eax, %ebx ; ATT
mov ebx, eax ; Intel
; 64位
movq %rax, %rbx ; ATT
mov rbx, rax ; Intel寻址方式
对于内存寻址在Intel汇编中表达的格式为
segment:[base index * scale offset]而在ATT中其表达的格式为
segment:offset(base, index, scale)在表达内存寻址时至少需要常量offset及基址base中的一项。下面我们通过几个例子了解一下不同情况下内存寻址的表示方式。
movl (%ebx), %eax ; ATT
mov eax, [ebx] ; Intel对于使用变量常量作为寻址的偏移量在ATT汇编中使用时不需要加上$前缀。例如将var指向内存位置中的值加载至eax中可分别通过下列语句实现
movl var, %eax ; ATT
mov eax, [var] ; Intel下面的例子中同时使用了基址寄存器与常量进行寻址的操作其中常量可以为一个立即数也可以是一个定义的变量。
movl 4(%ebx), %eax ; ATT
mov eax, [ebx 4] ; Intelmovl offset(%ebx), %eax ; ATT
mov eax, [ebx offset] ; Intel在C语言中我们可以简单的通过下标获取数组中的元素。例如对于int32类型的数组arr中的第i个元素我们可以使用arr[i]表达式获取。对于获取数组中元素使用Intel与ATT汇编分别为下列的两种表达方式
; arr[i], 假定变量i的值在eax中
mov ebx, [eax*4 _arr] ; Intel
movl _arr(,%eax,4), %ebx ; ATT下面表格总结了几种不同情况下Intel与ATT汇编的表达方式。
IntelATT[1234]1234[es:1234]%es:1234[eax](%eax)[eax ebx](%eax, %ebx)[eax ebx * 2](%eax, %ebx, 2)[ebx * 2](, %ebx, 2)[eax - 10]-10(%eax)[ds:ebp - 10]%ds:-10(%ebp)
参考资料
Brennan’s Guide to Inline AssemblyATT Assembly Syntax - UC Davis