сложение массивов и я ламер

Тема в разделе "WASM.BEGINNERS", создана пользователем Kronit, 10 дек 2006.

  1. Kronit

    Kronit New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2006
    Сообщения:
    2
    Здравствуйте..нужно решить задачу по сложению матриц, но вначале я решил попробовать просто с массивами и что-то не вышло(
    Код (Text):
    1. assume CS:code,DS:data
    2. ;исходные массивы и получаемый массив (m3)
    3. data segment  
    4. m1 db 1,2,3,4
    5. m2 db 5,5,5,5
    6. m3 db 4 dup (0)
    7. data ends
    8.  
    9. code segment
    10. start:
    11. mov ax,data  ;data -->ds
    12. mov ds,ax
    13. cld  ;обнуление  DF для команд stos и lods
    14. mov CX,4   ; счетчик цикла
    15. mov    es,ax   ; для stos вроде
    16. mov si,offset m1     ;адреса массивов "инициализируем"
    17. mov bx,offset m2
    18. mov di,offset m3
    19. @@cicl:
    20.    lodsb    ; элемент массива m1 в AX
    21.    add ax, [bx]   ; прибавляем к первому массиву второй
    22.    inc bx ; к следующему эл-ту m2
    23.    stosb ; результат в es:di
    24.  
    25.    ;вывод массива m3 на экран
    26.    mov ah,02h
    27.    mov dl,m3[di] ;собственно обход массива
    28.    add dl,'0' ; преобразование числа в символ
    29.    int 21h
    30. loop @@cicl
    31.  
    32.  
    33. mov ax,4c00h
    34. int 21h
    35. code ends
    36. end start
    только в результате мне выводится не получаемые значения, а ерунда...почему не могу понять..
    И еще, можно ли реализовать сложение массивов без stos и lods или эти команды обязательны?
    И еще вопросик по ходу: есть ли различия если переписать строку add ax, [bx] так add ax, bx ?
    подскажите плиз..
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Используй отладчик сразу всё поймёшь где твои проблемы, проглядев твой сорец беглым взлядом заметил:
    1) loop @@cicl должен явно быть перед выводом
    2) сами цифры не выведуться потому что выдоятся символы аскии (добадляй к цифрам 30h)
    3) конец строки в досе обозначается баксом '$'
    4) bx значит содержимое регистра а, [bx] - это то что находится в памяти по смещению которые находится в регистре bx (косвенная адресация)
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Kronit
    Вот как раз из-за этих дурных команд у тебя и выводится ерунда, т.к. stosb сохраняет al в [di] и увеличивает di на единицу и mov dl,[di] берет еще не записанное неинициализированное значение. А уж mov dl,m3[di] это вообще фиг знает что (по сути di+offset m3 - вообще далеко за пределами массива)
    Раз у тебя в цикле используется три массива, то лучше вообще не использовать lodsb\stosb, а делать так:
    Код (Text):
    1.   mov cx,4
    2.   lea si, [cx+offset m1]
    3.   lea bx, [cx+offset m2]
    4.   lea di, [cx+offset m3]
    5.   neg cx
    6. @@cicl:
    7.   mov al,[si+cx]
    8.   add al,[bx+cx]
    9.   mov [di+cx],al
    10.   ...   ;mov dl,al или mov dl,[di+cx]
    11.   add cx
    12.   jnz @@cicl
     
  4. Kronit

    Kronit New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2006
    Сообщения:
    2
    rain, leo СПАСИБО...теперь все понял.