Генератор коду мови асемблера¶
Генерує код в синтаксисі nasm на основі псевдо-асемблерні коду.
Перетворює обмежену кількість команд псевдо-асемблера у реальний код. Кожна команда має однозначний еквівалент в компіляторі асемблеру NASM.
-
pyCompiler.utils.gen_asm.
gen_real_asm
(pseudo, src_file)¶ Функція, що відповідає за генерацію кода
Parameters: - pseudo – код на псевдо-асемблері
- src_file – назва файлу вихідного коду
Return type: код для NASM
-
pyCompiler.utils.gen_asm.
nasm_gen
(l)¶ Перетворення команди на код в синтаксисі NASM
Parameters: l – команда псевдо-асемблера Return type: команда в синтаксисі NASM
Приклад¶
Код на мові myl:
function mul(x,y)
R = x*y;
return R;
endfunc;
read j;
i = 5*mul(j,2);
print i;
print "\n";
Генерує такий код на асемблері
; Source file: e7.src
; Generated 2012-11-11 15:35:50
SECTION .data
_kernel_: equ 0x80
; Strings
numbs: db "%d", 0
numbs_in_format: db "%d",0
; Variables
vmul_x: dd 0
vmul_y: dd 0
vmul_R: dd 0
vj: dd 0
vi: dd 0
SECTION .text
global _start
extern printf
extern scanf
extern getchar
extern fflush
extern stdout
_start:
; setup stack frame
push dword ebp
mov dword ebp, esp
; Function mul
jmp Func1End
Func_mul:
mov dword eax, [esp+4]
mov dword [vmul_x], eax
mov dword eax, [esp+8]
mov dword [vmul_y], eax
mov dword eax, [vmul_x]
mov dword ebx, [vmul_y]
imul ebx
ret
Func1End:
push dword vj
push dword numbs_in_format
call scanf
add esp, 8
call getchar
push dword 2
push dword [vj]
call Func_mul
add esp, 8
push dword eax
mov dword eax, 5
pop dword ebx
imul ebx
mov dword [vi], eax
push dword [vi]
push dword numbs
call printf
add esp, 8
push dword [stdout]
call fflush
add esp, 4
; restore stack frame
mov dword esp, ebp
pop dword ebp
mov dword ebx, 0
mov dword eax, 1
int _kernel_