Обновление переменной, которая живет в сегменте данных из стека и его сегмента - PullRequest
0 голосов
/ 12 июля 2011

В настоящее время у меня есть три сегмента памяти, мой основной сегмент данных, сегмент стека и сегмент, где живет мой API. Следующие инструкции выполняются из сегмента данных, они выдвигают адрес cursorRow и welcomeMsg, а затем выполняют дальний вызов функции в моем сегменте API. Переменная cursorRow находится в основном сегменте данных, который вызывает функцию API. Звонок выглядит так:

  push cursorRow
  push welcomeMsg
  call API_SEGMENT:API_printString

Как я могу изменить cursorRow внутри сегмента, где живет мой API, через стек? cursorRow должен быть обновлен из API. НИКАКИЕ функции API не изменяют сегмент данных. Я пробовал такие вещи, как: inc byte [ds:bp+8] и add [ds:bp+8], 1. Вот вызываемая процедура API:

printStringProc:
    push bp 
    mov bp, sp
    mov si, [bp+6]
    .printloop:
        lodsb
        cmp al, 0
        je printStringDone
        mov ah, 0x0E ; teletype output
        mov bh, 0x00 ; page number
        mov bl, 0x07 ; color (only in graphic mode)
        int 0x10
        jmp .printloop
    printStringDone:
    ; move the cursor down
    mov ah, 02h ; move cursor
    mov dh, [bp+8]
    mov dl, 0 ; column
    mov bh, 0 ; page number
    int 10h

    add [ds:bp+8], 1

  pop bp
  retf 

печатает строки, но переменная cursorRow не обновляется корректно. Я надеюсь, что я достаточно ясно по моей проблеме. Это сложно объяснить: D

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Похоже, вы просто поместили значение cursorRow в стек. Без адреса вы не сможете его обновить. С помощью адреса вы можете легко ссылаться на значение этих адресов, помещать его в регистр, выполнять над ним операции, затем принимать значение, которое находится в этом регистре, и помещать его в адрес cursorRow.

0 голосов
/ 12 июля 2011

Это потому, что вы передали указатель на cursorRow, а не сам cursorRow. Когда вы выполняете

inc [ds:bp+8]

вы: 1) получите значение bp, 2) добавьте 8, 3) предположите, что результатом является указатель в ds, 4) увеличьте значение, сохраненное там (указатель на cursorRow). Поскольку указатель хранится в стеке, при этом вы увеличиваете указатель. Что вам нужно сделать, это вытащить указатель из стека и увеличить значение , на которое указывает .

mov bx, [bp+8]
inc [bx]

Этот код: 1) получает значение bp, 2) добавляет 8, 3) предполагает, что результатом является указатель в ss, 4) загружает сохраненное там значение (указатель на cursorRow) в bx, 5) предполагает, что bx является указателем в ds, 6) увеличивает значение, сохраненное там (значение cursorRow).

...