NASM: удаленный вызов с сегментом и смещением, хранящимся в регистрах - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть сегмент кода и значения смещения, хранящиеся в двух регистрах, скажем, AX и BX соответственно.В NASM как я могу закодировать дальний вызов AX:BX?Я пытался call AX:BX, но я получил ошибку invalid combination of opcode and operands.Как мне закодировать эту инструкцию?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Нет способа кодировать инструкцию удаленного вызова, где сегмент и / или смещение находятся в регистрах.Инструкция дальнего вызова требует, чтобы адрес назначения был задан как непосредственный операнд, который предоставляет сегмент и смещение пункта назначения, или операнд памяти, который это делает.Таким образом, допустимы только примеры, подобные следующим инструкциям:

    call 0x1234:0x5678   ; immediate operand
    call FAR far_func    ; immediate operand
    call FAR [far_fnptr] ; memory operand
    call FAR [bp - 8]    ; memory operand

Так что, если у вас есть целевой сегмент и смещение в регистрах AX и BX, вам нужно будет сохранить значение в памяти, прежде чем вы сможете вызватьфункция, на которую указывают регистры.Например, вы можете сделать что-то вроде следующего:

    push ax
    push bx
    mov  bp, sp
    call FAR [bp]
    add  sp, 4

Часто в тот день, когда для этого использовалась инструкция RETF:

    push cs
    push .return_here
    push ax
    push bx
    retf   
.return_here:

Однако на современных процессорах это имеетзначительное снижение производительности, так как это приведет к тому, что буфер стека возврата процессора будет генерировать неверные прогнозы ветвления.

0 голосов
/ 28 сентября 2018

Вы должны положить их в память.Вы не можете выполнить дальний звонок через регистры.Предполагая, что bp установлен в качестве указателя кадра, вы можете использовать что-то вроде этого:

push ax
push bx
call far [bp-N]
add sp, 4

(с подходящим значением для N).

0 голосов
/ 28 сентября 2018

Вот один из способов сделать это:

push ax
push bx
retf
...