C指針原理(2)-AT&T匯編
阿新 • • 發佈:2018-11-24
swap 彈出 內存 dev -- flags 匯編 amp 操作 .section .text
data:
.byte 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01#8字節
.globl main
main:
movl $0x12345678,%edx
bswap %edx#反轉字符順序 ,結果為0x87654321
movl %edx,%eax
movl $1,%ebx
xadd %ebx,%eax#交換%eax和%ebx的值,並相加,結果放在目標位置%eax
cmpxchg %edx,%ebx#如果目標操作數%ebx等於%eax、16位是ax,8位是al,則把源操作數%edx的值加載到%eax中、16位
#是ax,8位是al,如果不等,則把目標操作數%ebx加到源操作數%edx加載到%eax中、16位是ax,8位是al
data:
.byte 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01#8字節
.globl main
main:
movl $0x12345678,%edx
bswap %edx#反轉字符順序 ,結果為0x87654321
movl %edx,%eax
movl $1,%ebx
xadd %ebx,%eax#交換%eax和%ebx的值,並相加,結果放在目標位置%eax
cmpxchg %edx,%ebx#如果目標操作數%ebx等於%eax、16位是ax,8位是al,則把源操作數%edx的值加載到%eax中、16位
#是ax,8位是al,如果不等,則把目標操作數%ebx加到源操作數%edx加載到%eax中、16位是ax,8位是al
movl $2,%edx#高位
movl $3,%eax#低位
cmpxchg8b data#如果%edx:%eax組成的8字節值與目標值data匹配,則把%edx:%eax組成的8字節值傳送到目標內存位置
#,否則將目標值data加載到%edx:%eax
pushad
popad
#pusha/popa 壓入彈出所有16位通用寄存器
#pushad/popad 壓入彈出所有32位通用寄存器
#pushf/popf 壓入彈出EFLAGS寄存器的低16位
#pushf/popf 壓入彈出EFLAGS寄存器的全部32位
AT&T匯編關於地址和取地址操作的示例代碼如下:
.section .data mynum: .int 8 mygs: .asciz "%x----%x----%x\n" .section .text .globl main main: leal mynum,%eax #將mynum地址復制到%eax movl (%eax),%ebx#將%eax內地址所指內容復制到%ebx movl mynum,%ecx#將mynum內容復制到%ecx中 push %ecx push %ebx push %eax push $mygs call printf push $0 call exit 乘法和除法操作如下: .section .data .section .text .globl main main: movl $2,%eax movl $5,%ebx mul %ebx#%eax*%ebx->%eax,無符號乘法 movl $-2,%eax movl $5,%ebx imul %ebx#%eax*%ebx->%eax,有符號乘法 #除法使用dev和idev(有符號)
C指針原理(2)-AT&T匯編