запись в память

Тема в разделе "WASM.BEGINNERS", создана пользователем RLC, 8 фев 2008.

  1. RLC

    RLC New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    4
    Доброго времени суток. Я ассемблер изучаю ток месяца 1,5 а активнонедельки 2 и вот встала следующая проблема:
    Ввод в тему:
    (ia-16)одна из процедур формирует исходные 20 -ти битные данные в cx,dx. При выходе из процедуры необходимо заполнить эти регистры старыми значениями и поэтому вых данные процедуры нужно куда то девать.
    И собственно вопрос:
    как мне эти данные выкинуть в память(в голову приходит мысль о прямой адресации) по типу
    mov es:X,bx
    mov es:Y,dx
    Где X,Y ранее объявленные переменные X db LENBUFS DUP(0) если что то не так то поправте.
    Заранее благодарю
     
  2. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Э. Точно в память? Чем push неустраивает?

    push cx
    push dx
    call yourfunc
    ... do something
    pop dx
    pop cx

    Если через память:
    X dw ?
    Y dw ?

    ...
    mov es:[X], cx
    mov es:[Y], dx

    Пожалуйста.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    С каких это пор push - это не в память?
     
  4. RLC

    RLC New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    4
    Спасибо большое! push не подходит тк при выходе из процедуры мне надо из стёка востановить "старые" данные в регистрах которые я pop'ом отправил. тоесть до сих пор окончание процедуры выглядело:
    myfunc
    PUSH CX
    PUSH DX
    ......;изменение СX и DX
    @L2:
    MOV AX,DX
    POP CX
    POP DX
    RET
    благодарю! ты помог мне!
    Всем спасибо!
     
  5. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    l_inc
    Не надо придираться к словам.
    Имелось ввиду - выделение отдельной переменной и запись в нее.

    RLC
    Не понял в чем проблема, обственно.
    Тебе надо результат работы функции вернуть в cx, dx или надо что бы функция не меняла значений cx, dx?
    Если последнее, то твой вариант с push/pop и так не будет их менять.
    Если надо что бы менял, за пределами функцию делаешь push/pop (как я показал) и убираешь push/pop из тела функции.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Joes
    Вообще-то надо. У меня были знакомые, которые всерьез считали, что стэк - это что-то особенное, хранящееся исключительно внутри ЦП. Так что во избежание недоразумений стоит конкретнее выражать свою мысль. Особенно при ответе на вопрос новичку.

    Вообще-то RLC нужно было сохранить значения регистров, передав при этом значения, сформированные функцией внутри cx и dx, во внешнюю функцию. Так что стэк здесь с трудом подходит.
     
  7. RLC

    RLC New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    4
    "нужно было сохранить значения регистров, передав при этом значения, сформированные функцией внутри cx и dx, во внешнюю функцию. Так что стэк здесь с трудом подходит."
    Да абсолютно верно!
     
  8. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    l_inc
    Честно говоря, читая многие горе-учебники по асму, запросто можно прийти к таким выводам )))
     
  9. RLC

    RLC New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    4
    Блин. не работает.
    вот что тасм пишет на
    MOV ES:[XBUF],DX

    Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

    Assembling file: mlab1.asm
    **Error** chetchik.asm(93) Operand types do not match
    Error messages: 1
    Warning messages: None
    Passes: 1
    Remaining memory: 399k

    используется 386 проц и ia-16
    пробовал и MOV ES:XBUF,DX и MOV XBUF,DX и MOV [XBUF],DX всё одно и тоже и выдаёт одну и ту же ошибку.
    Всё всё разобрался просто XBUF db BUFLEN DUP(0) а не XBUF dw BUFLEN DUP(0) так что спасибо!!!
     
  10. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    l_inc
    С такой точки зрения - согласен. Комментарий насчет памяти был конкретно про переменные.

    Гм, тогда я не понял постановки задачи:

    push cx
    push dx
    call myFunction
    call externalFunction
    pop dx
    pop cx

    Результат из myFunction будет в cx, dx и он же передастся в следующую функцию (externalFunction)

    Вобщем, ладно, главное что автор разобрался.