.text
.globl main
main:
## true && false
mov $1, %rdi
test %rdi, %rdi
jz .T0 # l'opérateur && est paresseux
mov $0, %rdi
.T0:
call print_bool
## if 3 <> 4 then 10 * 2 else 14
mov $3, %rdi
cmp $4, %rdi
je .T1false
mov $10, %rdi
imul $2, %rdi
jmp .T1
.T1false:
mov $14, %rdi
.T1:
call print_int
## 2 = 3 || 4 <= 2*3
mov $2, %rdi
cmp $3, %rdi
sete %dil
movzbq %dil, %rdi # movzbq = mov with zero extension
test %rdi, %rdi
jnz .T2 # l'opérateur || est paresseux
mov $4, %rbx
mov $2, %rcx
imul $3, %rcx
cmp %rcx, %rbx # attention au sens !
setle %bl
movzbq %bl, %rdi
.T2:
call print_bool
mov $0, %rax # on termine proprement
ret
## une routine pour afficher un entier (%rdi) avec printf
print_int:
mov %rdi, %rsi
mov $message, %rdi # arguments pour printf
mov $0, %rax
call printf
ret
## une routine pour afficher un booléen (%rdi) avec printf
print_bool:
cmp $0, %rdi
je .Lfalse
mov $true, %rdi
jmp .Lprint
.Lfalse:
mov $false, %rdi
.Lprint:
mov $0, %rax
call printf
ret
.data
message:
.string "%d\n"
true:
.string "true\n"
false:
.string "false\n"
## Local Variables:
## compile-command: "gcc -no-pie bool.s && ./a.out"
## End: