Я пытаюсь имитировать следующий код, который должен напечатать 1 2 в сборке:Ассамблея x86-64: по умолчанию на коммутаторе заявление
a=1
switch(a) {
default: print 1;
case 2: print 2;
}
и это то, что у меня есть:
movq $1, a
pushq a
popq %rdx
cmp $1, %rdx
jne if_0
jmp if_1
if_0:
movq $1, %rsi
pushq %rsi
movq $format, %rdi
popq %rsi
pushq %rbp
call printf
movq %rbp, %rsp
popq %rbp
jmp if_2
if_1:
movq $2, %rsi
pushq %rsi
popq %r11
cmpq %rdx, %r11
je if_2
jne if_3
if_2:
movq $2, %rsi
pushq %rsi
movq $format, %rdi
popq %rsi
pushq %rbp
call printf
movq %rbp, %rsp
popq %rbp
jmp if_4
if_3:
if_4:
jmp switch_0
Вверху, я только сравниваю переменную с 1, потому что я не уверен, что делать. Как я могу смотреть в будущее и видеть, что a не равен 2, прежде чем делать случай по умолчанию?
Непонятно, с чем вы столкнулись. Вам не нужно проверять случаи в порядке, указанном в источнике. Очевидно, что вы хотите оставить «default» последним, если ничего не сопоставить. – Jester
Несколько языков применяют 'default:' как последнюю вещь в 'case', поэтому ваш пример недействителен, но предположим, что это возможно. Другой способ написать этот пример: 'if (2! = A) {print 1; } print 2; '... но всегда как' a = 1', вы можете просто '{print 1; печать 2; } 'без какой-либо логики. – Ped7g