48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
import stdio
|
||
import t, c
|
||
|
||
|
||
# ============================================================
|
||
# c.Asm 内联汇编测试
|
||
# ============================================================
|
||
|
||
def asm_test() -> int:
|
||
# 1. 简单无操作数汇编(nop + clobber)
|
||
c.Asm("nop", op=[t.ASM_DESCR.CLOBBER_MEMORY])
|
||
stdio.printf("asm: nop ok\n")
|
||
|
||
# 2. 仅汇编文本无 clobber
|
||
c.Asm("nop")
|
||
stdio.printf("asm: nop2 ok\n")
|
||
|
||
# 3. 多 clobber
|
||
c.Asm("nop", op=[t.ASM_DESCR.CLOBBER_MEMORY, t.ASM_DESCR.CLOBBER_CC])
|
||
stdio.printf("asm: multi-clobber ok\n")
|
||
|
||
# 4. 带输入操作数的汇编(读取 CPU ID)
|
||
# 使用 f-string 内联 c.AsmInp
|
||
# mov eax, 输入值; nop(保持简单,不使用会产生异常的指令)
|
||
val: int = 42
|
||
c.Asm(f"""mov eax, {c.AsmInp(val, t.ASM_DESCR.REG_ANY)}
|
||
nop""", op=[t.ASM_DESCR.CLOBBER_RAX])
|
||
stdio.printf("asm: input ok val=%d\n", val)
|
||
|
||
# 5. 带输出操作数的汇编
|
||
# c.AsmOut 获取结果
|
||
result: int = 0
|
||
c.Asm(f"""mov {c.AsmOut(result, t.ASM_DESCR.OUTPUT_REG)}, 123
|
||
nop""", op=[t.ASM_DESCR.CLOBBER_RAX])
|
||
stdio.printf("asm: output result=%d\n", result)
|
||
|
||
# 6. 带输入和输出操作数
|
||
# result2 = val + 1
|
||
result2: int = 0
|
||
input_val: int = 10
|
||
c.Asm(f"""mov eax, {c.AsmInp(input_val, t.ASM_DESCR.REG_ANY)}
|
||
add eax, 1
|
||
mov {c.AsmOut(result2, t.ASM_DESCR.OUTPUT_REG)}, eax
|
||
nop""", op=[t.ASM_DESCR.CLOBBER_RAX])
|
||
stdio.printf("asm: in+out result2=%d (expect 11)\n", result2)
|
||
|
||
return 0
|