在NASM的%rep部分中标记

时间:2016-01-24 21:30:44

标签: assembly preprocessor nasm

我有import json from oauth2client.client import SignedJwtAssertionCredentials # The scope for the OAuth2 request. SCOPE = 'https://www.googleapis.com/auth/analytics.readonly' # The location of the key file with the key data. KEY_FILEPATH = 'path/to/json-key.json' # Load the key file's private data. with open(KEY_FILEPATH) as key_file: _key_data = json.load(key_file) # Construct a credentials objects from the key data and OAuth2 scope. _credentials = SignedJwtAssertionCredentials( _key_data['client_email'], _key_data['private_key'], SCOPE) # Defines a method to get an access token from the credentials object. # The access token is automatically refreshed if it has expired. def get_access_token(): return _credentials.get_access_token().access_token 预处理器指令,它创建一个预处理器循环。 我想在其中声明标签,可能有一些连接,但我无法正确使用语法。

%rep

那么如何强制NASM预处理器为每个"迭代生成%assign i 0 %rep 64 label_%i: ;this, of course, doesn't work inc rax %assign i i+1 %endrep "?

2 个答案:

答案 0 :(得分:4)

这可以使用%+表示法来完成。以下是文档的摘录:

  

4.1.4连接单行宏标记:%+

     

单行宏中的单个标记可以连接到   产生更长的代币以供以后处理。如果,这可能很有用   有几个类似的宏执行类似的功能。

     

请注意,%+之后需要一个空格   从多行宏中使用的语法%+ 1中消除歧义。

有关预处理器中此功能和其他功能的更多信息,请参见here

答案 1 :(得分:1)

如果您不需要引用%rep块外部的标签,则可以使用宏内本地%%label语法:

%macro  jmpfwd 0
    times 21 nop
    jmp %%fwd                  ;;;;;   <<<------ This jump
    add ax, 0x1234    ; can this stall decoding?
;    lea eax, [ebx+edx+1]
  align 64
  %%fwd:                       ;;;;;   <<<------ jumps here
%endmacro

然后在%rep

中使用该宏
    .looptop:
%rep 4
    jmpfwd
%endrep
; times 4 jmpfwd   nope, TIMES only works on (pseudo)instructions, not macros

    dec ecx
    jnz .looptop

(事实证明,Skylake can decode this without LCP stalls every iteration,在add与无条件jmp的分支预测之前点击与jmp相同的组中的解码器时,只有少数LCP停顿说明生效。times 21 nop阻止它适应uop缓存。)