我有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
"?
答案 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缓存。)