Tasm

Тема в разделе "Другие", создана пользователем Cool J, 19 май 2007.

Статус темы:
Закрыта.
  1. Cool J

    Cool J Гость

    Доброго времени суток!
    На данный момент работаю с Ассемблером
    TURBO ASSEMBLER 5.0
    Есть некое задание... нужно выполнить в течении сегодняшнего - завтрашнего дня.
    Открывал много книг, примеров... написал приблезительный шаблон програмы...
    Но вот не удается достичь необходимой цели. Програма практически написаная... верней уже написана - работает но выводит совсем не то что нужно... Очень нужна помощь... Советом либо подсказкой... буду очень рад.

    Итак перейду к делу:

    Условие задачи таково...
    Дано число k (0 < k < 11) и матрица размером 4 x 10. Найти сумы элементов всех ее рядов и столбцов. Найти суму и произведение элементов k-го столбца данной матрицы.

    Код (Text):
    SEGM segment
    assume CS:SEGM, DS:SEGM, ES:SEGM, SS:SEGM
    org 100h
    Begin:
    ;************************************** поиск сумм строчек*********************************************
    mov si,0  ;si=столбцы в матрице
    mov bx,0  ;bx=строки в матрице
    mov cx,4  ;число для внешнего цикла (по строчкам)

    external: ;внешний цикл по строчкам
    mov al,array[bx][si]          ;в ax первый элемент матрицы
    push cx ;сохранение в стеке счётчика внешнего цикла
    mov cx,10 ;число для внутреннего цикла
    mov si,0

    iternal:  ;внутренний цикл по строке
    inc si   ;передвижение на следующий элемент в строке
    add al,tmp ;подсчет суммы строки
    mov tmp,al ;запомнили сумму

    loop iternal;цикл по строке cx раз
    pop cx   ;восстанавливаем CX из стека

    ;вывод на экран суммы н-ой строки
    mov ah,02h ;вывод сообщения на экран
    mov dl,tmp
    add dl,30h ;додаємо до нашої цифри у масві 30h, оскільки, з саме з цього числа в таблиці ASCII кодів, починаютсья цифри
    int 21h
    mov dl,13 ;перехід на наступну строку, і встановлення курсора на початок строки
    mov ah,02h
    int 21h
    mov dl,10
    mov ah,02h
    int 21h
    ;конец вывода на экран

    mov tmp,0
    add bx,1  ;передвигаемся на следующую строку
    loop external         ;цикл (внешний)
    ;***********************************теперь поиск сумм столбцов (и К-ой произведение)*********************************************
    mov tmp,0 ;обнулиние
    mov si,0  ;si=столбцы в матрице
    mov bx,0  ;bx=строки в матрице
    mov cx,10 ;число для внешнего цикла (по столбцам)

    external1: ;внешний цикл по столбцам
    mov al,array[bx][si]          ;в ax первый элемент матрицы
    push cx ;сохранение в стеке счётчика внешнего цикла
    mov cx,4  ;число для внутреннего цикла (по стобцу)
    mov bx,0

    iternal1:  ;внутренний цикл по столбцу
    add bx,1  ;передвижение на следующий элемент в столбце
    add al,tmp ;подсчет суммы столбца
    mov tmp,al ;запомнили сумму

    mov ax,bx
    cmp al,k  ;сравниваем номер столбца с заданным К
    jne here  ;если не совпал с искомым, то переход на here
    mov ax,0
    mov al,array[bx][si]
    mul tmp1  ;перемножаем
    mov tmp1,ax;сохраняем

    here:

    loop iternal1;цикл по столбцу cx раз
    pop cx   ;восстанавливаем CX из стека

    ;вывод на экран суммы н-го столбца
    mov ah,02h ;вывод сообщения на экран
    mov dl,tmp
    add dl,30h ;додаємо до нашої цифри у масві 30h, оскільки, з саме з цього числа в таблиці ASCII кодів, починаютсья цифри
    int 21h
    mov dl,13 ;перехід на наступну строку, і встановлення курсора на початок строки
    mov ah,02h
    int 21h
    mov dl,10
    mov ah,02h
    int 21h
    ;конец вывода на экран

    mov tmp,0
    inc si   ;передвигаемся на следующий столбец
    loop external1        ;цикл (внешний)
    ;*******************************************************************************
    *****************************************
    ;вывод умножения к-того столбца
    mov ah,02h ;вывод сообщения на экран
    mov dx,tmp1
    add dl,30h ;додаємо до нашої цифри у масві 30h, оскільки, з саме з цього числа в таблиці ASCII кодів, починаютсья цифри
    int 21h
    ;конец выода на экран

    mov ax,4c00h; ф-ця для коректного виходу, і для коректноого завершення роботи
    int 21h
    ;data
    array db 1,2,3,4,5,6,7,8,9,1,1,2,3,4,5,6,7,8,9,1,1,2,3,4,5,6,7,8,9,1,1,2,3,4,5,6,7,8,9,1;это массив 10 на 4, заполнял цыфрами что бы не было переполнения
    k db 3   ;номер заданного столбца
    tmp db 0    ;temp переменная для суммы
    tmp1 dw 1  ;temp переменная для произведения

    SEGM ends
    end Begin
    (Коментарии к строком на Русско-Украинском, сам с Украины... за это прошу прощния)

    После компеляции и линковки... запуска exe-шки:
    вывело на екран такое
    Код (Text):
    0
    0
    0
    0
    6
    6
    6
    6
    6
    6
    6
    6
    6
    6
    0
    Но увидив масив вы поймете что полученый результат не соответсвует действительности...
    Ех... очень нужно отладить эту програму...

    Ответы давайте здесь, либо в ICQ 304719012
    Попробую отблагодарить того кто поможет.

    С уважением Виталий.
     
Статус темы:
Закрыта.

Поделиться этой страницей