Как на Ассемблере сделать сложные условия? на C эта конструкция выглядела бы так:if(cmd=="a") getHelp(); else if(cmd=="b") openTextEditor(); else if(cmd=="c") reboot(); А как мне написать на assembler'е?(P.S. я использую FASM)
В FASM можно использовать инструкцию cmp для сравнения значений и условные переходы (je, jne, jmp, jg, jl, jge, jle) для выполнения нужного блока кода в зависимости от результата сравнения.
Пример кода на FASM, реализующего аналогичную логику:
section .data cmd db "a", 0 section .text global _start _start: mov eax, 4 ; Вводим команду mov ebx, 1 mov ecx, cmd mov edx, 1 int 0x80 cmp byte [cmd], 'a' ; Сравниваем команду с "a" je a_label ; Если равны, переходим в блок кода для команды "a" cmp byte [cmd], 'b' ; Сравниваем команду с "b" je b_label ; Если равны, переходим в блок кода для команды "b" cmp byte [cmd], 'c' ; Сравниваем команду с "c" je c_label ; Если равны, переходим в блок кода для команды "c" jmp end_label ; Если ни одна из условий не выполнены, пропускаем все блоки и переходим к завершению программы a_label: ; блок кода для команды "a" call getHelp jmp end_label b_label: ; блок кода для команды "b" call openTextEditor jmp end_label c_label: ; блок кода для команды "c" call reboot jmp end_label end_label: ; конец программы getHelp: ; функция для команды "a" ret openTextEditor: ; функция для команды "b" ret reboot: ; функция для команды "c" ret
В данном примере, в зависимости от значения переменной cmd будут вызываться нужные функции.
В FASM можно использовать инструкцию cmp для сравнения значений и условные переходы (je, jne, jmp, jg, jl, jge, jle) для выполнения нужного блока кода в зависимости от результата сравнения.
Пример кода на FASM, реализующего аналогичную логику:
section .datacmd db "a", 0
section .text
global _start
_start:
mov eax, 4 ; Вводим команду
mov ebx, 1
mov ecx, cmd
mov edx, 1
int 0x80
cmp byte [cmd], 'a' ; Сравниваем команду с "a"
je a_label ; Если равны, переходим в блок кода для команды "a"
cmp byte [cmd], 'b' ; Сравниваем команду с "b"
je b_label ; Если равны, переходим в блок кода для команды "b"
cmp byte [cmd], 'c' ; Сравниваем команду с "c"
je c_label ; Если равны, переходим в блок кода для команды "c"
jmp end_label ; Если ни одна из условий не выполнены, пропускаем все блоки и переходим к завершению программы
a_label:
; блок кода для команды "a"
call getHelp
jmp end_label
b_label:
; блок кода для команды "b"
call openTextEditor
jmp end_label
c_label:
; блок кода для команды "c"
call reboot
jmp end_label
end_label:
; конец программы
getHelp:
; функция для команды "a"
ret
openTextEditor:
; функция для команды "b"
ret
reboot:
; функция для команды "c"
ret
В данном примере, в зависимости от значения переменной cmd будут вызываться нужные функции.