Сохранить массив результата в стеке

Тема в разделе "WASM.ASSEMBLER", создана пользователем voland95, 26 апр 2008.

  1. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    Плиз помогите разобраться здесь надо что то поменять чтобы сохранить массив результата в стеке. Препод говорит надо использовать команду mov ss:??? а куда её здесь и за место чего писать хз и ещё какую то типа блок схему надо построить.Плиз помогите куда эту команду сунуть????
    Код (Text):
    1. push ds          ; поместить в стек номер адреса возврата
    2. sub ax,ax
    3. push ax          ; в стек номер адреса возврата = 0
    4. mov ax,dseg      ; инициализация сегмента данных
    5. mov ds,ax
    6.  
    7. mov al,07h  ; задание значения константы в регистре al
    8. mov cx,5    ; счетчик элементов в массиве
    9. mov bx,offset source  ; адрес 1-го элемента  массива в регистре bx
    10. lea di, dest   ; приемника-в di
    11.  
    12. again:    mov ah,[bx] ; перемещение элемента  массива с  адресом в регистре[CODE=asm]
    13.  
    14.  bx в регистр  ah
    15. add ah,al   ; прибавить к содержимому регистра ah  содержимое регистра al
    16. mov [di],ah ; перемещение числа из регистра ah в массив-приемник по адресу из регистра di
    17. inc bx     ; увеличение адреса текущего  элемента  в исходном массиве
    18. inc di     ; увеличение адреса текущего элемента в массиве суммы
    19. loop again        ; конец цикла
    20. ret                ; возврат из процедуры
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Код (Text):
    1. mov ss:[di],ah
    если требуется, чтобы сохранение в сегмент стека происходило. ss, вероятно, при этом надо проинициализировать.
     
  3. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    значит
    Код (Text):
    1. mov ss:[di],ah
    я меняю на 5 строчку снизу так?
    Для инициализации мне надо выделить место в стеке под массив результатов:
    Код (Text):
    1. push bp
    2. mov bp,sp
    3. sub sp, размер_массива_кратный_двум
    теперь ss:[bp] указывает на массив результата так?
    И при завершении надо восстановить стек
    Код (Text):
    1. add sp,размер_массива
    2. pop bp
    ?
    Скажите или подскажите я хоть верно мыслю!
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да.
    Если речь идет о начале ф-ии, то да.
    Код (Text):
    1. sub sp, размер_массива_кратный_двум
    количество_элементов_массива * их_размер.
    Нет. ss:[bp] указывает на сохраненный там указатель предыдущего стекового кадра. Чтобы достучаться до массива в стеке надо выполнить 'mov di, sp'.
    Да. Как вариант можно сделать
    Код (Text):
    1. mov sp, bp
    2. pop bp
    или инструкцией 'leave', что то же самое.
    Как увидишь, что работает, значит начал мыслить верно :).
     
  5. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    попробую потестить если не получится надеюсь подскажешь!
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    voland95
    Это нелогично. Массив ведь и есть результат работы функции.
    Тут два варианта :
    1) все правильно и вызывающая программа просто работает с массивом, не трогая стек.
    2) память в стеке выделяет вызывающая программа и тогда нет вопросов. Адрес и длину
    нам должны дать и достаточно только команды mov ss.....
    Как "извращенный" вариант - на стеке только длина и сам массив.
    Стек в варианте 2 по любому вызывающая прога корректирует.
     
  7. Jes

    Jes New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    3
    to Voland95
    Ты бы по конкретней задачку описал, а то я согласен с valterg - логики не видно (или это просто препод решил над тобой поиздеваться?). Ну а на счет блок-схем, чего ж тут непонятного - 1 цикл и все.
     
  8. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    объясняю дан вот этот кусок кода программы.Задача:сохранить массив результата в стек!Вот!Я как полный текст кода напишу выложу мало ли ошибка где будет.Но препод сказал надо использовать типа команду mov ss:?? так как иначе сохранение произойдет в сегмент данных.Но препод если честно ещё та ведьма.
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    voland95
    что-то Ваш, с постановкой задачи, смахивает на сантехника саню :.(
    иль мож ты его не так понял?
     
  10. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    ТАБЛИЦА Варианты для введения изменений в учебную программу
    13.Сохранить массив результата в стеке/
    вот постановка задачи из методички.Учебная программа
    Код (Text):
    1. push ds          ; поместить в стек номер адреса возврата
    2. sub ax,ax
    3. push ax          ; в стек номер адреса возврата = 0
    4. mov ax,dseg      ; инициализация сегмента данных
    5. mov ds,ax
    6.  
    7. mov al,07h  ; задание значения константы в регистре al
    8. mov cx,5    ; счетчик элементов в массиве
    9. mov bx,offset source  ; адрес 1-го элемента  массива в регистре bx
    10. lea di, dest   ; приемника-в di
    11.  
    12. again:    mov ah,[bx] ; перемещение элемента  массива с  адресом в регистре[CODE=asm]
    13.  
    14.  bx в регистр  ah
    15. add ah,al   ; прибавить к содержимому регистра ah  содержимое регистра al
    16. mov [di],ah ; перемещение числа из регистра ah в массив-приемник по адресу из регистра di
    17. inc bx     ; увеличение адреса текущего  элемента  в исходном массиве
    18. inc di     ; увеличение адреса текущего элемента в массиве суммы
    19. loop again        ; конец цикла
    20. ret                ; возврат из процедуры
    Да и кстати у меня препод женщина(ведьма)
    Как доступнее объяснить постановку задачи я ещё не знаю.
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    voland95
    Если женщина, то сказать про mov ss:... и больше ни одного слова про прогаммирование. На дворе весна, птички поют и цветочки. Где мои 17 лет и мой черный.....
     
  12. Jes

    Jes New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    3
    Ну постановка может выглядеть так:
    Дан массив целых однобайтовых чисел длины N. Добавить к каждому элементу массива число M и записать полученный массив в стеке.

    Номер задания оправдывает само задание))))
     
  13. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    Код (Text):
    1.   title lab3
    2.   page ,132  ;сегмент стека
    3.    sta segment para stack 'stack'
    4.    db 64 dup('stack')  ; область стека
    5.   sta ends
    6.   ;сегмент данных
    7.   dseg segment
    8.   source db 01h,0afh,0fh,08h ;исходный массив
    9.   dest db 4 dup(?) ;зарезервировано для нового массива
    10.   dseg ends
    11.  
    12.   subtt3 lab3
    13.   page
    14.   ;сегмент кода
    15.    cseg segment
    16.    assume cs:cseg,ds:dseg,ss:sta
    17.  
    18.   entry proc far   ;начало процедуры
    19.  
    20. [b]push bp
    21. mov  di,sp  
    22. sub sp, 64[/b]          
    23. je 0021                  
    24. jb 001F                
    25. sub al,0F                          
    26. nop                    
    27. add al,0F          
    28. [b]mov  ss:[di],ah[/b]
    29. inc bx                
    30. inc di  
    31. [b]mov sp, bp
    32. pop bp[/b]
    33.                
    34. ret
    35. entry endp           ;конец процедуры
    36. sta ends             ;конец сегмента стека
    37. end entry             ;конец программного модуля
    Блин незнаю не робит.turbo debugger вылетает при запуске этой проги.Посмотрите пож и подскажите какие здесь команды лишние.и ваще с таким кодом возможно сохранить массив результата в стек?у какого какие идеи.
     
  14. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    - внесённые мной изменения
     
  15. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    b \b-внесённые мной изменения
     
  16. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    voland95
    Ты написал только подпрограмму. Еще должна быть главная программа, которая ее вызывает. Поэтому и вылетает...
     
  17. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    Код:
    title lab3
    page ,132 ;сегмент стека
    sta segment para stack 'stack'
    db 64 dup('stack') ; область стека
    sta ends
    ;сегмент данных
    dseg segment
    source db 01h,0afh,0fh,08h ;исходный массив
    dest db 4 dup(?) ;зарезервировано для нового массива
    dseg ends

    subtt3 lab3
    page
    ;сегмент кода
    cseg segment
    assume cs:cseg,ds:dseg,ss:sta

    entry proc far ;начало процедуры

    push bp
    mov di,sp
    sub sp, 64

    je 0021
    jb 001F
    sub al,0F
    nop
    add al,0F
    mov ss:[di],ah
    inc bx
    inc di
    mov sp, bp
    pop bp


    ret
    entry endp ;конец процедуры
    sta ends ;конец сегмента стека
    end entry ;конец программного модуля
    Блин незнаю не робит.turbo debugger вылетает при запуске этой проги.Посмотрите пож и подскажите какие здесь команды лишние.и ваще с таким кодом возможно сохранить массив результата в стек?у какого какие идеи.
    В смысле главная программа.Вот эта прога вся полностью просто принажатии F9 в turbo debuger вылетает ошибка типа закрыть или пропустить!вот!я думаю проблема в том что в коде есть ошибки.кто знает подскажите всё таки в чём проблема?подпрограмма в самом начале поста, а в конце полный листинг
     
  18. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Главная программа в принципе может кончаться командой ret, но должна иметь оператор call - вызов подпрограммы. Иначе в отладчике лажа получится - подпрограмму в нем нельзя по F9 запускать, только по шагам посмотреть - там и увидишь куда ты улетел... И абсолютные адреса
    je 0021
    jb 001F
    нафига ставить ? Короче неуд вам батенька, даже КОЛ!
     
  19. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    немного понял.буду ещё кооректировать код.
     
  20. voland95

    voland95 New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    28
    у какого какие ещё мысли есть по стеку?