# An example of using the BSWAP instruction (数据交换)
########################## swap instruction ###############
# xchg operand1, operand2 # reg<->reg, reg<->mem, (不能同时是 mem)。当一个操作数是内存位置时,处理器的LOCK信号被自动标明
# # 防止在交换过程中任何其他处理器访问这个内存位置。缺点是LOCK太耗时,对程序性能有不良影响。
# bswap operand1 # 当所使用的系统具有不同的字节排列方式时,它很有用。
# # 反转寄存器中字节的顺序。第0~7位和第24~31位进行交换,第8~15位和第16~23位交换。
# # 记住这一点很重要:位的顺序没有被反转;被反转的是寄存器中包含的各个字节。
# # 这样就从小尾数(little-endian)的值生成了大尾数(big-endian)的值,反之亦然。
# xadd source, destination # 用于交换两个寄存器或者内存位置和寄存器的值,把两个值相加,然后把结果存储在目标位置(reg or mem).
# # source 必须是寄存器,destination 可以是寄存器或内存位置,并包含相加的结果。
# cmpxchg source, destination # 比较目标操作数和EAX、AX、AL寄存器中的值。相等,把源操作数的值加载到目标操作数中。
# # 不相等,就把目标操作数加载到EAX、AX或AL寄存器中。
# cmpxchg8b destination # 和cmpxchg相似,但它处理8字节值。destination操作数引用一个内存位置,其中的8字节值会与EDX和EAX
# # 寄存器中包含的值进行比较(EDX高位,EAX低位)。匹配,就把位于ECX:EBX寄存器对中的64位值传送给
# # 目标内存位置。不匹配,就把目标内存地址中的值加载到EDX:EAX寄存器对中。
########################## swap instruction ###############
.section .data
output:
.asciz "The swap value is 0x%x\n"
.section .text
.globl main
main:
nop
xor %ebx, %ebx
movl $0x12345678, %ebx
bswap %ebx
push %ebx
push $output
call printf # printf(output, ebx)
add $8, %esp # 还原esp
push $0
call exit
# gcc -o swap 04-swap.s -m32
# The swap value is 0x78563412 # 和原始值相反的尾数顺序