Как ROM_CALL работает в 8086 программировании на ассемблере? - PullRequest
0 голосов
/ 27 декабря 2018

Пожалуйста, помогите мне разобраться с проблемами 1 и 2.

Как работает кодовая строка с пометкой "ПРОБЛЕМА 1"?
Что произойдет, когда мы вызовем ROM_CALL в "ПРОБЛЕМЕ 2""?

ROMRTN  DD      0FE000000H      ;Main ROM entry point.

ROM_CALL:
    PUSH    DI
    PUSH    SI
    PUSH    BP
    PUSH    DX
    PUSH    ES
    CALL    CS:DWORD PTR [ROMRTN]     ;PROBLEM 1
    POP     ES
    POP     DX
    POP     BP
    POP     SI
    POP     DI
    RET

    PAGE
    SUBTTL  Initalization code and temporary work areas.

;
; Overlayed by MSDOS by SYSINIT.
;

WRKSTK  LABEL   WORD
    DB      100 DUP (?)


HWINIT: XOR     BP,BP
    MOV     SS,BP
    MOV     SP,OFFSET WRKSTK+98     ;Some nice area for 
                                                                  ;stack

    PUSH    CS
    POP     ES

    MOV     BX,ROM_INIT
    CALL    ROM_CALL                           ;PROBLEM 2
    MOV     AH,0
    MOV     MCON,AX

    MOV     AX,SEG SYSINIT
    MOV     DS,AX

ASSUME  DS:SEG SYSINIT

    MOV     AX,CS
    ADD     AX,BIOSIZS
    MOV     DS:[CURRENT_DOS_LOCATION],AX
    MOV     DS:[MEMORY_SIZE],MAX_MEM
    MOV     AX,CS
    MOV     WORD PTR DS:[DEVICE_LIST+2],AX
    MOV     WORD PTR DS:[DEVICE_LIST],OFFSET 
    DEVSTART
    MOV     AX,CS
    ADD     AX,((OFFSET WRKSTK - OFFSET INIT)+50) /16
    MOV     DS:[FINAL_DOS_LOCATION],AX
    JMP     SYSINIT

DOSSPOT LABEL   WORD

CODE    ENDS

    END

Я думаю, что приведенный ниже URL поможет вам понять логику.Привязка кода взята из самой последней из полной программы.

https://github.com/Microsoft/MS-DOS/blob/master/v2.0/source/SKELIO.ASM

1 Ответ

0 голосов
/ 27 декабря 2018
CALL    CS:DWORD PTR [ROMRTN]     ;PROBLEM 1

как работает упоминание строки кода в ПРОБЛЕМЕ 1

Эта инструкция выполняет дальний вызов ячейки памяти, адрес которой хранится в переменной, помеченной ROMRTN .

ROMRTN  DD      0FE000000H      ;Main ROM entry point.

Несмотря на то, что вы видите это как 32-битное двойное слово, вам действительно нужно рассматривать его как сегмент: смещенная пара .В конце концов, это 16-битный код!

ROMRTN  DD      0FE00h:0000h      ;Main ROM entry point.

или записан так, как он хранится в памяти (x86 - младший порядок байтов):

ROMRTN  DW      0000h, 0FE00h     ;Main ROM entry point.

Дальний вызов затем переходит кячейка памяти с линейным адресом 0FE000h.То есть вы умножаете слово сегмента (здесь это 0FE00h) на 16, а затем добавляете слово смещения (здесь это 0000h).


CALL    ROM_CALL                           ;PROBLEM 2

Тогда что произойдет, когда мы вызовемROM_CALL в ПРОБЛЕМЕ 2.

Эта инструкция выполняет почти полный вызов подпрограммы, помеченной ROM_CALL .
Программист мог выбрать встроенный код подпрограммы, но, вероятно, полныйПрограмма выполняет несколько системных вызовов bios и, таким образом, сохраняет многоуровневый подход.Также возможно, что указатель, хранящийся в ROMRTN , со временем изменяется, что делает эту процедуру гибкой частью программы.

...