Неправильно работает стек

Тема в разделе "WASM.BEGINNERS", создана пользователем L1aQu, 22 июн 2007.

  1. L1aQu

    L1aQu New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2007
    Сообщения:
    3
    В одной из первых своих программ наткнулся на проблему: из стека в регистр достается не то значение, которое я в него записывал. Разъясните ситуацию.
    Вот код:
    Код (Text):
    1. 13D9:0100 30C0        XOR      AL,AL
    2. 13D9:0102 B406        MOV      AH,06
    3. 13D9:0104 B710        MOV      BH,10
    4. 13D9:0106 B505        MOV      CH,05
    5. 13D9:0108 B110        MOV      CL,10
    6. 13D9:010A B610        MOV      DH,10
    7. 13D9:010C B23E        MOV      DL,3E
    8. 13D9:010E CD10        INT      10
    9. 13D9:0110 51          PUSH     CX          //вроде как тут в стек записал 0510
    10. 13D9:0111 B90400      MOV      CX,0004
    11. 13D9:0114 E80400      CALL     011B
    12. 13D9:0117 E2FB        LOOP     0114
    13. 13D9:0119 CD20        INT      20
    14. 13D9:011B 88CB        MOV      BL,CL
    15. 13D9:011D 59          POP      CX          //а тут из него вылезает 0117
    16. 13D9:011E 80C710      ADD      BH,10
    17. 13D9:0121 80C501      ADD      CH,01
    18. 13D9:0124 80C101      ADD      CL,01
    19. 13D9:0127 80EE01      SUB      DH,01
    20. 13D9:012A 80EA01      SUB      DL,01
    21. 13D9:012D CD10        INT      10
    22. 13D9:012F 51          PUSH     CX
    23. 13D9:0130 31C9        XOR      CX,CX
    24. 13D9:0132 88D9        MOV      CL,BL
    25. 13D9:0134 EBE1        JMP      0117
    С моим мизерным опытом(которого нет пока) я не знаю, почему так. Объясните пожалуйста. А файл что-то не прилагается
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не факт, что после int 10h CX = 0510
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    L1aQu
    Попытаюсь ответить... хотя сомневаюсь, что у меня опыта побольше. :)
    При вызове CALL 011B в стек кладется адрес возврата из процедуры (как раз адрес следующей инструкции: 0117). А Ваш CX хранится теперь чуть глубже по стеку (подозреваю, что байта этак на четыре). Поэтому достать Ваш СХ можно с помощью
    Код (Text):
    1. mov bp, sp
    2. add sp, 4
    3. pop cx
    4. mov sp, bp
    Способ очень глупый. Это я так: для наглядности. А на самом деле чаще всего используется косвенная адресация с использованием bp для доступа к аргументам.
     
  4. L1aQu

    L1aQu New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2007
    Сообщения:
    3
    Проверил, после int 10 - CX = 0510

    l_inc
    Сейчас буду пробовать. Стек - капризная штука. А машинный код я вот только сегодня изучать начал, отсюда и непонятные места.
     
  5. L1aQu

    L1aQu New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2007
    Сообщения:
    3
    Решил проблему. Доставал из стека два раза. Понял, как работает. Всем спасибо
     
  6. AntiINetwork

    AntiINetwork New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2007
    Сообщения:
    24
    L1aQu
    Посмотри описание команды call (она записывает адрес возврата в стэк, а ты его как раз и извлекаешь).

    Код (Text):
    1. push cx
    2. mov cx, 4
    3. call 011b
    4. LOOP     0114
    5. INT      20
    6. MOV      BL,CL
    7. push bp ; сохраняем регистр bp
    8. mov bp, sp
    9. mov cx, [bp+4] ; так как в стэке bp и адрес возврата, +4 потому что формат слова у bp и у адреса возврата
    10. pop bp ; востанавливаем регистр bp
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    L1aQu
    Не вижу смысла в call'е, если адрес возврата статичен. Лишнее загрязнение стека и лишний pop.