Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > помогите понять в чем ошибка


Автор: Schneider 21.3.2008, 01:08
Выводит совершенно неверные данные((
Код

; Для матрицы С(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



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

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

Автор: Schneider 23.3.2008, 23:08
Если кому интересно, то решение след.
Код


Для матрицы С(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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)