Работа со стеком - Assembler

Узнай цену своей работы

Формулировка задачи:

Приветствую всех! Я новичок в Ассемблере и столкнулся с проблемой, решение которой не могу найти. Суть вот в чём. Есть сегмент стека:
SSeg SEGMENT para stack 'stack'
    DB 256 DUP(?)
SSeg ENDS
Есть сегмент данных с массивом тип байт: Tabl DB 10 DUP (4 DUP (?)) (Естественно, в сегменте данных). Этот массив я заполнил целочисленными положительными значениями. Хочу теперь поместить его в стек (помещаю поэлементно):
MOV BX, 0
MOV CX, 40
      M10:
       PUSH [Tabl+BX]
       INC BX
      LOOP M10
Но так не работает. Пишет, что аргумент имеет неправильный размер. Я пробовал разобраться и понял, что надо загонять в стек элементы, только типа DW. Но в моём случае, массив типа Байт. Как быть то? Пробовал крутить с регистрами (расширение и т. д.). Не помогло. Поэтому, прошу помощи! Как мне Запихнуть этот массив в стек (поэлементно)?

Решение задачи: «Работа со стеком»

textual
Листинг программы
mov cx,40
sub sp,cx
mov bx,sp
xor dx,dx
@@01:mov    al,tabl[di]
mov es:[bx+di],al
inc di
loop    @@01

Объяснение кода листинга программы

  1. mov cx,40 - переменной cx присваивается значение 40
  2. sub sp,cx - отнимает от sp значение 40 и сохраняет результат в sp
  3. mov bx,sp - переменной bx присваивается значение sp
  4. xor dx,dx - переменная dx инициализируется значением 0
  5. mov al,tabl[di] - в al записывается значение из памяти по адресу di (в данном случае из таблицы tabl)
  6. mov es:[bx+di],al - в память по адресу bx+di записывается значение из al
  7. inc di - значение di увеличивается на 1
  8. loop - выполнение команд с 5 по 7 повторяется до тех пор, пока di не станет равным 0 (это означает, что мы прошлись по всей таблице)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.429 из 5