- 论坛徽章:
- 0
|
今天翻精华,看见这个帖子,后来忘记这个帖子了
说实话,其实我还是没有完全理解,但是估计就是我现在理解的这个意思了
#include <stdio.h>
int main()
{
unsigned short cs = 0;
volatile unsigned short a,b,c,d,e,f;
asm ("movw %%cs,%0\n\t"
:"=&r"(cs):"r"(a),"r"(b),"r"(c),"r"(d),"r"(e),"r"(f));
printf("%x\n",cs);
}
这个代码编译出错,因为没有通用寄存器可用
但是如果没有&,则可以重用
.file "cs.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%x\n"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl %ecx, -16(%ebp)
movzwl -18(%ebp), %edx/////
movl %ebx, -12(%ebp)
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movzwl -20(%ebp), %edi
movzwl -22(%ebp), %esi
movzwl -24(%ebp), %ebx
movzwl -26(%ebp), %ecx
movzwl -28(%ebp), %eax
#APP
movw %cs,%dx//dx是输入
####如果这个后面还有代码要使用a的值(dx),那么将不是a原始的值
#NO_APP
movzwl %dx, %edx
movl %edx, 4(%esp)
movl $.LC0, (%esp)
call printf
movl -16(%ebp), %ecx
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
.section .note.GNU-stack,"",@progbits |
|