- 論壇徽章:
- 0
|
今天翻精華,看見這個帖子,后來忘記這個帖子了
說實話,其實我還是沒有完全理解,但是估計就是我現(xiàn)在理解的這個意思了
#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 |
|