Debagger. Откуда берутся значения AX, DS, AH?

Тема в разделе "WASM.BEGINNERS", создана пользователем progma137, 10 ноя 2007.

  1. progma137

    progma137 Виктор Франкенштейн

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    18
    Адрес:
    Кривой Рог
    Обьясните откуда вылазят эти цифры(прим. внизу). Так вот:
    Написал на асме простую прогу(суммирует 5+3).
    Откомпилировал на TASM.
    Открыл дебаггер и пошагово прошелся по коду проги.
    Все бы да ничего, но вот непонятно откуда берутся значения AX, DS, AH. И для чего они нужны.
    Код (Text):
    1.     .MODEL SMALL
    2.     .DATA
    3. x   DW  5
    4. y   DW  3
    5. z   DW  ?
    6.     .CODE
    7. begin:  MOV AX,@DATA
    8.     MOV DS,AX
    9.     MOV AX,X
    10.     ADD AX,Y
    11.     MOV Z,AX
    12.     MOV AH,4CH
    13.     INT 21H
    14.     END begin
    Код (Text):
    1. ;*************Как это изначально находится в дебаггере********************************
    2. AH  BYTE    ' ' 0   (00H)
    3. DS  WORD    21195       (52CBH)
    4. AX  WORD    0       (0H)
    5. ;************* MOV  AX,@DATA *****************************************************
    6. AH  BYTE    'R' 82  (52H)
    7. DS  WORD    21195       (52CBH)
    8. AX  WORD    21212       (52DCH)
    9. ;************* MOV  DS,AX ********************************************************
    10. AH  BYTE    'R' 82  (52H)
    11. DS  WORD    21212       (52DCH)
    12. AX  WORD    21212       (52DCH)
    13. ;************* MOV  AX,X *********************************************************
    14. AH  BYTE    ' ' 0   (0H)
    15. DS  WORD    21212       (52DCH)
    16. AX  WORD    5       (5H)
    17. ;************* ADD  AX,Y *********************************************************
    18. AH  BYTE    ' ' 0   (0H)
    19. DS  WORD    21212       (52DCH)
    20. AX  WORD    8       (8H)
    21. ;************* MOV  Z,AX *********************************************************
    22. AH  BYTE    ' ' 0   (0H)
    23. DS  WORD    21212       (52DCH)
    24. AX  WORD    8       (8H)
    25. ;************* MOV  AH,4CH *******************************************************
    26. AH  BYTE    'L' 76  (4CH)
    27. DS  WORD    21212       (52DCH)
    28. AX  WORD    19464       (4C08H)
    29. ;************* INT  21H **********************************************************
    30. AH  BYTE    '♣'   5   (05H)
    31. DS  WORD    9433        (24D9H)
    32. AX  WORD    1362        (552H)
    33. ;************* END  BEGIN ********************************************************
    спасибо за внимание :)
     
  2. MagnumGT

    MagnumGT New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    122
    Как же ты прогу писал, если не знаешь, что такое регистры?
    Почитай статьи для дзенствующих, тут, на сайте. Найдешь ответы.
    Да и гугл тебе поможет быстрее, чем дождешься развернутого ответа
    ИБО лень
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Код (Text):
    1. MOV AX,@DATA
    Заносит в AX адрес сегмента данных (начинается в программе с директивы .DATA)

    Код (Text):
    1. MOV DS,AX
    Передаёт адрес сегмента данных из AX в DS (именно сегментный регистр DS используется для доступа к данным, если не давать процессору иных указаний). Напрямую загрузить адрес сегмента в сегментный регистр нельзя, поэтому и используется передача через регистр AX.

    Код (Text):
    1.     MOV AX,X
    2.     ADD AX,Y
    3.     MOV Z,AX
    В регистр AX загружается значение переменной X (там лежит 5), затем к содержимому AX прибавляется содержимое переменной Y (3), после чего полученный результат (8) записывается в переменную Z.

    Код (Text):
    1.     MOV AH,4CH
    2.     INT 21H
    Завершение работы программы и выход в ДОС.
     
  4. progma137

    progma137 Виктор Франкенштейн

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    18
    Адрес:
    Кривой Рог
    я списал код
    что значит "напрямую" ? разве MOV это не "напрямую"?
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Напрямую -- это значит прямо в DS, минуя промежуточный регистр (AX в данном случае). Нельзя написать команду MOV DS, @DATA
     
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  7. progma137

    progma137 Виктор Франкенштейн

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    18
    Адрес:
    Кривой Рог
    Понятно. спасибо. токо вот не понял, что значит:
    Код (Text):
    1. MOV AH,4CH
    AH эт регистр, а 4CH эт значение. а для чего это перемещается? какое это имеет значение?
    и 4СH это что-то вроде кода в некой таблице?
    И последнее, значение @DATA откуда берется? кто/что дает это значение?
     
  8. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    progma137

    4Ch -- это код функции MS DOS "завершение программы", а вызов этой (как и многих других) функции осуществляется следующей командой INT 21h.

    @DATA -- это встроенная "переменная" транслятора ассемблера, в которой он хранит адрес сегмента данных. Т.е. если сегмент данных начинается по адресу 1000h:0000h, то @DATA будет иметь значение 1000h.
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    исчо es в строковых инструкциях, либо ss при доступе к стеку
    lds,les...
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    FreeManCPM

    а) строковые инструкции и доступ к стеку -- специфические вещи, а человек только-только начал пытаться что-то в ассемблере понять, и грузить его лишним (на этом этапе) незачем.

    б) LDS, LES и иже с ними грузят не сегментный регистр, а регистровую пару -- сегментный регистр и один из РОНов. Загрузить константу в сегментный регистр напрямую нельзя.