Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

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

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

Код:

.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, 23:57   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 22,623
Репутация: 5062
По умолчанию

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

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

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

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

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

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

Код:

mov bp, sp
mov bx, [bp +2]

Alexey04 вне форума   Ответить с цитированием
Старый 15.11.2017, 00:47   #4
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 22,623
Репутация: 5062
По умолчанию

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

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

А ещё можно сделать так:
Код:

writeString:
  pop cx  ; адрес возврата
  pop dx  ; параметр
  mov ah,9
  int 21h
  jmp cx  ; вместо ret, т.к. адрес возврата мы уже вынули

__________________
Делаю лабы на Asm: asmlabs.ru
Tell me would you kill to save a life? Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn, this hurricane's chasing us all underground...
7in вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




04:15.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru