Другие языки программирования и технологии

Простой вопрос по прыжкам ассемблера

Здравствуйте. Как в ассемблере TASM32/MASM перепрыгивать на одну из 120 меток для совершения одной из 120 операций (или блоков из нескольких операций) с двумя регистрами (к примеру). Скажем поступил номер операции "3", мы перепрыгиваем на 3ю операцию (скажем на 6 операций вперед - по две, с учетом прыжка в конец после каждого блока), если 5ю операцию, то например на 10 операций вперед. Чтобы вручную это не прописывать например так: Если регистр AL равен 5 то по флагу Z прыгаем на метку 5. Ну т. е. не прописывать 120 раз обработчик перепрыгиваний на 120 процедур или операций, а сделать автоматический перепрыг. AL = 111, то прыгаем на 111ю метку и так для всех меток.
Именно на вычисляемую метку простого способа прыгнуть ЕМНИП нет.
Но адрес можно вычислить. Если расположить каждый фрагмент вычислений по определенниму адресу.
Андрей Франко
Андрей Франко
58 008
Лучший ответ
Составляете таблицу смещений и вперед. Работающий пример для Win32:

.386
.model flat, stdcall

;Смотрите сами что у Вас с путями.
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
;Таблица смещений процедур для каждого ebx
table dd offset p1, offset p2
;Для сообщений. Особой роли не играют.
msg1 db "I'm 1", 0
msg2 db "I'm 2", 0

.code
start:
;При ebx=0 будет вызов p1, при ebx=1 p2 и т. д. легко расширить
mov ebx, 1
call [table + ebx*4]
invoke ExitProcess,0

;Пример процедуры 1
p1 proc
invoke MessageBox,0,ADDR msg1,0,1
ret
p1 endp

;Пример процедуры 2
p2 proc
invoke MessageBox,0,ADDR msg2,0,1
ret
p2 endp

end start
end

В чем основная проблема - "операции" разной длины. Если бы блоки кода были одинаковой длины - можно обойтись без таблицы смещений. Но если блоки кода одинаковой длины и очень однотипны по коду - вероятно Вы что-то делаете не так и код можно упростить.

Тут показано как с процедурами. Есс-но jmp [table+ebx*4] тоже допустим - смотрите что Вам лучше процедуры и вызовы или прыжки.
В командах переходов есть частный случай, именуемый как ВЫЧИСЛЯЕМЫЙ ПЕРЕХОД. Рассмотрим пример такого перехода.

ВЫЧИСЛЯЕМЫЙ ПЕРЕХОД

PCL EQU H0002 ; регистр спец назначения

; со счётчиком команд

; … любая команда

MOVF KLOP,W ; копировать в регистр W число из регистра KLOP

ADDWF PCL,F ; сложить содержимое PCL с содержимым W

; … команда 1

; … команда 2

; … команда 3

Принцип работы вычисляемого перехода.

Рассматривая метки мы затрагивали работу счетчика команд – это регистр специального назначения PCL по адресу h2. Предположим, что в нашей программе 15 строк с командами, которые выполняются друг за другом. После выполнения первой команды счетчик команд автоматически увеличивается на единицу и т. д. до 15-ой команды. В вычисляемом переходе мы можем принудительно изменить счетчик и перейти на другую строчку (как правило, счётчик увеличивают).

Например, в аккумуляторе W у нас число 0, тогда переход произойдет на строчку "команда 1"; а если у нас в аккумуляторе число 2, тогда переход произойдет на строчку "команда 3", т. е. переход на одну команду больше, чем содержимое в аккумуляторе.

http://labkit.ru/html/Assembler_for_PIC?id=328
Нурлан Андамасов MASM-же. Какой PIC?