Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2017, 22:37   #1
Alexey04
 
Регистрация: 13.10.2016
Сообщений: 5
По умолчанию Проблемы с стеком

Почему так программа работает

Код:
.MODEL SMALL
.STACK 100h
.DATA
    Message DB 'Hello World',13,10,'$'
.CODE
START:
    mov ax,@data
    mov ds,ax
   
    mov ax, offset Message
    push ax
    pop bx
    call writeString
    mov ah,4ch
    int 21h
   
writeString:  ;pop bx СТРОКА ЗАКОММЕНТИРОВАННА
             ;push bx
             ;push dx
             
             ;mov bx, ax
             mov ah, 9h
             mov dx, bx
             int 21h
             
             ;pop dx
             ;pop bx
             ret
             
               
END START
А так не работает нормально

Код:
.MODEL SMALL
.STACK 100h
.DATA
    Message DB 'Hello World',13,10,'$'
.CODE
START:
    mov ax,@data
    mov ds,ax
   
    mov ax, offset Message
    push ax
    ;pop bx СТРОКА ЗАКОММЕНТИРОВАННА
    call writeString
    mov ah,4ch
    int 21h
   
writeString:  pop bx 
             ;push bx
             ;push dx
             
             ;mov bx, ax
             mov ah, 9h
             mov dx, bx
             int 21h
             
             ;pop dx
             ;pop bx
             ret
             
               
END START
Alexey04 вне форума Ответить с цитированием
Старый 14.11.2017, 22:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alexey04 Посмотреть сообщение
А так не работает нормально
команда Call помещает адрес возврата в тот же стек, откуда Вы хотите сделать pop bx
в результате вашего лишнего pop bx :

1) в bx попадает мусор вместо ожидаемого значения ax, которое вы занесли в стек перед вызовом процедуры
2) при выполнении команды ret управление передаётся не в точку вызова

в принципе можно обратиться и к тому значению, которое Вы занесли в стек через регистр sp, но Вам точно это нужно?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2017, 23:18   #3
Alexey04
 
Регистрация: 13.10.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
команда Call помещает адрес возврата в тот же стек, откуда Вы хотите сделать pop bx
в результате вашего лишнего pop bx :

1) в bx попадает мусор вместо ожидаемого значения ax, которое вы занесли в стек перед вызовом процедуры
2) при выполнении команды ret управление передаётся не в точку вызова

в принципе можно обратиться и к тому значению, которое Вы занесли в стек через регистр sp, но Вам точно это нужно?
Спасибо за ответ. Мне нужно это в чисто образовательных целях
Что-то типо? Вроде работает. Правильно?

Код:
mov bp, sp
mov bx, [bp +2]
Alexey04 вне форума Ответить с цитированием
Старый 14.11.2017, 23:47   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Alexey04 Посмотреть сообщение
Правильно?
ну, имхо, да, правильно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.11.2017, 22:24   #5
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Alexey04 Посмотреть сообщение
Что-то типо? Вроде работает. Правильно?
Только обычно bp сохраняют предварительно (и потом восстанавливают), и тогда будет mov bx,[bp+4] (только почему бы сразу не записывать в dx)?

А ещё можно сделать так:
Код:
writeString:
  pop cx  ; адрес возврата
  pop dx  ; параметр
  mov ah,9
  int 21h
  jmp cx  ; вместо ret, т.к. адрес возврата мы уже вынули
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Работа со стеком Евангелина Гедерт Помощь студентам 0 16.06.2014 02:44
Работа со стеком ksu04061992 Помощь студентам 0 28.05.2012 01:37
Работа со стеком YTP0 Паскаль, Turbo Pascal, PascalABC.NET 0 06.04.2011 17:40
Работа со стеком 0479 Общие вопросы по Java, Java SE, Kotlin 2 27.02.2011 21:38
Работа со стеком KBAC Помощь студентам 0 26.12.2010 12:54