1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Tasm

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

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

    Cool J Гость

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

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

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

    Код:
    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-шки:
    вывело на екран такое
    Код:
    0
    0
    0
    0
    6
    6
    6
    6
    6
    6
    6
    6
    6
    6
    0
    Но увидив масив вы поймете что полученый результат не соответсвует действительности...
    Ех... очень нужно отладить эту програму...

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

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

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