2011-08-25 38 views
6

Tôi muốn viết một macro khí để tạo mã chứa các hướng dẫn movdqu khác nhau để đăng ký xmm tùy thuộc vào tham số n.Tự động tạo tên đăng ký xmm trong macro khí?

.macro xxmov n, p1 
      .if (\n == 1) 
      xor %eax, %eax 
      .endif 
      .if (\n - 1) 
      xxmov (\n - 1), \p1 
      .endif 
      movdqu ((\n - 1)*0x10)(\p1), %xmm0 
    .endm 

    xxmov 14, %rsi 

Khi biên soạn, mã tháo rời là,

0000000000000000 <.text>: 
    0:    31 c0     xor %eax,%eax 
    2:    f3 0f 6f 06    movdqu (%rsi),%xmm0 
    6:    f3 0f 6f 46 10   movdqu 0x10(%rsi),%xmm0 
    b:    f3 0f 6f 46 20   movdqu 0x20(%rsi),%xmm0 
    10:    f3 0f 6f 46 30   movdqu 0x30(%rsi),%xmm0 
    15:    f3 0f 6f 46 40   movdqu 0x40(%rsi),%xmm0 
    1a:    f3 0f 6f 46 50   movdqu 0x50(%rsi),%xmm0 
    1f:    f3 0f 6f 46 60   movdqu 0x60(%rsi),%xmm0 
    24:    f3 0f 6f 46 70   movdqu 0x70(%rsi),%xmm0 
    29:    f3 0f 6f 86 80 00 00 movdqu 0x80(%rsi),%xmm0 
    30:    00 
    31:    f3 0f 6f 86 90 00 00 movdqu 0x90(%rsi),%xmm0 
    38:    00 
    39:    f3 0f 6f 86 a0 00 00 movdqu 0xa0(%rsi),%xmm0 
    40:    00 
    41:    f3 0f 6f 86 b0 00 00 movdqu 0xb0(%rsi),%xmm0 
    48:    00 
    49:    f3 0f 6f 86 c0 00 00 movdqu 0xc0(%rsi),%xmm0 
    50:    00 
    51:    f3 0f 6f 86 d0 00 00 movdqu 0xd0(%rsi),%xmm0 
    58:    00 

Tuy nhiên, khi tôi thay thế% xmm0 với% XMM \ n trong vĩ mô xxmov ở trên, tôi đã biên soạn lỗi,

$ gcc -c mac.s 
mac.s: Assembler messages: 
mac.s:17: Error: bad register name `%xmm(((((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((((14 - 1)- 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((((14 - 1)- 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((((14 - 1)- 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((((14 - 1)- 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(((14 - 1)- 1)- 1)' 
mac.s:17: Error: bad register name `%xmm((14 - 1)- 1)' 
mac.s:17: Error: bad register name `%xmm(14 - 1)' 

Vì vậy, nó có anyway tôi có thể thao tác vĩ mô của tôi để xmm đăng ký tên (từ% xmm0 đến% xmm_ {n-1})? Tôi đã thử \ @ (% xmm \ @) được đề cập trong http://sourceware.org/binutils/docs/as/Macro.html#Macro. Tuy nhiên, nó không hoạt động rất tốt vì tôi muốn sử dụng macro này nhiều lần, trong khi \ @ dường như tăng lên một cách đơn điệu ..

Trả lời

2

Làm thế nào thay vì đếm ngược bạn giữ một biến đếm? Như thế này:

.macro xxmov n, p1, cnt=0 
    .if (\cnt == 0) 
     xor %eax, %eax 
    .endif 
    .if (\cnt != \n) 
     movdqu \@*0x10(\p1), %xmm\@ 
     xxmov \n, \p1, (\cnt + 1) 
    .endif 
.endm 

    xxmov 14, %rsi 

nào tạo:

0000000000000000 <.text>: 
    0: 31 c0      xor %eax,%eax 
    2: f3 0f 6f 06     movdqu (%rsi),%xmm0 
    6: f3 0f 6f 4e 10    movdqu 0x10(%rsi),%xmm1 
    b: f3 0f 6f 56 20    movdqu 0x20(%rsi),%xmm2 
    10: f3 0f 6f 5e 30    movdqu 0x30(%rsi),%xmm3 
    15: f3 0f 6f 66 40    movdqu 0x40(%rsi),%xmm4 
    1a: f3 0f 6f 6e 50    movdqu 0x50(%rsi),%xmm5 
    1f: f3 0f 6f 76 60    movdqu 0x60(%rsi),%xmm6 
    24: f3 0f 6f 7e 70    movdqu 0x70(%rsi),%xmm7 
    29: f3 44 0f 6f 86 80 00 00 00 movdqu 0x80(%rsi),%xmm8 
    32: f3 44 0f 6f 8e 90 00 00 00 movdqu 0x90(%rsi),%xmm9 
    3b: f3 44 0f 6f 96 a0 00 00 00 movdqu 0xa0(%rsi),%xmm10 
    44: f3 44 0f 6f 9e b0 00 00 00 movdqu 0xb0(%rsi),%xmm11 
    4d: f3 44 0f 6f a6 c0 00 00 00 movdqu 0xc0(%rsi),%xmm12 
    56: f3 44 0f 6f ae d0 00 00 00 movdqu 0xd0(%rsi),%xmm13 

Cập nhật: Rất tiếc, đó chỉ có tác dụng cho việc sử dụng vĩ mô đầu tiên trong tập tin. Nếu bạn cần phải sử dụng nó nhiều hơn một lần trong cùng một tập tin, nó trông giống như sử dụng cú pháp .altmacro được con đường để đi (nó có thể được tắt một lần nữa với .noaltmacro):

.altmacro 
.macro xxmov n, p 
    .if (\n == 1) 
     xor %eax, %eax 
    .endif 
    .if (\n > 1) 
     xxmov %(\n - 1), \p 
    .endif 
    movdqu (\n - 1)*0x10 (%\p) , %xmm\n 
.endm 
    xxmov 4, rsi 
    xxmov 14, rsi 
+0

vâng, .altmacro sẽ giúp đây . Cảm ơn. – 0xa5a5

Các vấn đề liên quan