Основной вопрос о декларации сегмента стека - PullRequest
3 голосов
/ 07 мая 2011

Эй, я только начинаю изучать ассемблер, и вот что я не понимаю ...

В декларации сегмента стека мы используем что-то вроде

     TOS LABEL WORD

Я знаю, что TOS относится к вершине стека, но не понимаю, что за ним следует и для чего. Помощь будет оценена.

1 Ответ

3 голосов
/ 07 мая 2011

То, что вы здесь делаете, это определение метки (указателя стека (SP)), которая содержит адрес вершины стека.Метка всегда будет содержать адрес, куда было передано последнее значение.

  • Когда вы вызываете операцию PUSH, содержимое регистра или ячейки памяти копируется в стек и SPуменьшается.

  • Когда вы вызываете POP, содержимое того места, на которое указывает SP (TOS), копируется в любой регистр или ячейку памяти, на которую вы его накладываете, и SP увеличивается на единицу.

Использование обозначения любого адреса для константы или переменной заключается в том, что это проще, чем записать его местоположение в памяти в шестнадцатеричном формате.

EDIT

Причина, по которой он уменьшается на PUSH, заключается в том, что стек увеличивается в памяти при каждом новом значении.Поэтому, если вы думаете о том, чтобы поместить книги в коробку, расположение нижней части ячейки равно 100, вы добавляете книгу в ячейку памяти 100. Затем добавьте еще одну, и она будет в ячейке памяти 99. Затем ячейка памяти 99 становится TOS.

РЕДАКТИРОВАТЬ 2 Некоторые ассемблеры используют LABEL в качестве директивы, а некоторые нет.Так что в этом случае TOS - это «метка», а WORD - тип данных.

Таким образом, вы можете иметь:

label1 LABEL WORD
.
.;code
.

или в других ассемблерах (к чему я привык)Просто:

label1:
.
.
.

Сначала я не знал, в каком контексте вы использовали это. Вот ресурс, который я использовал: http://www.emu8086.com/assembler_tutorial/compatibility.html

...