Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите понять в чем ошибка 
:(
    Опции темы
Schneider
  Дата 21.3.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008
Где: Минск

Репутация: нет
Всего: нет



Выводит совершенно неверные данные((
Код

; Для матрицы С(M, N) найти вектор A(M) каждый i-ый элемент
; которого равен сумме элементов i-го столбца
model small
.stack 100h
.data
    m equ 3 ; кол-во строк 
    n equ 4 ; кол-во столбцов
    mat db 1, 2, 3, 0
        db 4, 5, 6, 0
        db 7, 8, 9, 0
    ;cуммы в данном случае 12, 15, 18, 0
    vector db n dup(0); результирующий вектор
    sum db 0
.code


outint  proc    near
        push    cx
        push    dx
        push    bx
        push    ax
; Проверяем число на знак.
        test    ax, ax
        jns     short @oi1
; Если оно отрицательное, выведем минус и оставим его модуль.
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop     ax
        push    ax
        neg     ax
; Количество цифр будем держать в CX.
@oi1:   xor     cx, cx
        mov     bx, 10
@oi2:   xor     dx, dx
        div     bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    ax, ax
        jnz     short @oi2
; Теперь приступим к выводу.
        mov     ah, 02h
@oi3:   pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    @oi3
        pop     ax
        pop     bx
        pop     dx
        pop     cx
        ret
outint  endp


main:
    mov si,0   ;si - столбцы в матрице  
    mov bx,0   ;bx - строки в матрице
    mov cx,m  ;число для внешнего цикла (по строчкам)
    
external:  ;внешний цикл по строчкам
    push cx    ;сохранение в стеке счётчика внешнего цикла
    mov cx,n  ;число для внутреннего цикла
    mov si,0
    mov sum,0

    iternal:   ;внутренний цикл по строке
        mov al,mat[bx][si]
        inc si     ;передвижение на следующий элемент в столбце
        add sum,al ;запомнили сумму
        loop iternal;цикл по строке cx раз    
    
    pop cx     ;восстанавливаем CX из стека    
    mov ah, sum
    mov vector[si],ah ;записываем результат в вектор
    add bx,1   ;передвигаемся на следующую строку
loop external           ;цикл (внешний)

mov cx,n  ;отобразим результат
mov si,0   ;si - столбцы в матрице 

output:
inc si
mov al,vector[si]
call outint
mov     ah, 02h
mov     dl, ' '
int     21h
loop output

mov    ax,4c00h           
int    21h    

end main



PM MAIL   Вверх
dumb
Дата 21.3.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



наводка:
Цитата(Schneider @  21.3.2008,  01:08 Найти цитируемый пост)
mov al,mat[bx][si]

=
Код
mov al,mat[bx+si]

PM MAIL   Вверх
Schneider
Дата 23.3.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.1.2008
Где: Минск

Репутация: нет
Всего: нет



Если кому интересно, то решение след.
Код


Для матрицы С(M, N) найти вектор A(M) каждый i-ый элемент которого равен сумме элементов i-го столбца

model small
.stack 100h
.data
    m equ 3 ; кол-во строк 
    n equ 4 ; кол-во столбцов
    mat db 1, 2, 3, 0
        db 4, 5, 6, 0 
        db 7, 8, 9, 0
    ;cуммы в данном случае 12, 15, 18, 0
    sum db 0
.code


outint  proc    near
        push    cx
        push    dx
        push    bx
        push    ax
; Проверяем число на знак.
        test    ax, ax
        jns     short @oi1
; Если оно отрицательное, выведем минус и оставим его модуль.
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop     ax
        push    ax
        neg     ax
; Количество цифр будем держать в CX.
@oi1:   xor     cx, cx
        mov     bx, 10
@oi2:   xor     dx, dx
        div     bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
        test    ax, ax
        jnz     short @oi2
; Теперь приступим к выводу.
        mov     ah, 02h
@oi3:   pop     dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; Повторим ровно столько раз, сколько цифр насчитали.
        loop    @oi3
        pop     ax
        pop     bx
        pop     dx
        pop     cx
        ret
outint  endp


main:
    mov ax,@data; начальная установка
    mov ds,ax
    
    xor ax,ax
    xor si,si 
    mov cx,n
    
external:  ;внешний цикл по строчкам
    mov sum,0
    push cx
    mov cx,m
    xor bx,bx
    xor ax,ax

    iternal:
        mov al,mat[bx][si]
        add sum,al ;запомнили сумму
        add bx,n   ;передвигаемся на следующую строку
        loop iternal    
    
    mov al, sum
    call outint
    mov     ah, 02h
    mov     dl, ' '
    int     21h
    
    inc si     ;передвижение на следующую строку
    pop cx     ;восстанавливаем CX из стека        

loop external           ;цикл (внешний)


mov    ax,4c00h           
int    21h    

end main


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.