Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2017, 12:55   #1
Angelik
Новичок
Джуниор
 
Регистрация: 14.11.2017
Сообщений: 6
По умолчанию Матрица в ассемблер

В матрице C ( M,N) заменить все отрицательные элементы на нуль. M=3, N=3.

Кто нибудь может помочь с этим?
Angelik вне форума Ответить с цитированием
Старый 14.11.2017, 13:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Angelik Посмотреть сообщение
Кто нибудь может помочь с этим?
помочь можно только тому, кто что-то делает.
Где ваши попытки решить задачу? Что конкретно не получается?
И какой у Вас Ассемблер?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2017, 17:44   #3
Angelik
Новичок
Джуниор
 
Регистрация: 14.11.2017
Сообщений: 6
По умолчанию

Код:
LOCALS
 
.model small
 
.stack 100h
 
.data
        A       dw      1, 2, -3, 4, -5, -6, -7, 8
        Len     equ     ($-A)/2
        CrLf    db      0Dh, 0Ah, '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        call    ShowArray
 
        mov     cx,     Len
        lea     si,     A
        mov     ax,     0
@@For:
        test    word ptr [si],  -1
        jns     @@Next
        mov     [si],   ax
@@Next:
        add     si,     2
        loop    @@For
 
        call    ShowArray
 
        mov     ax,     4C00h
        int     21h
main    endp
 
;Выводит содержимое массива A на экран
ShowArray       proc
        push    ax
        push    si
        push    cx
        push    dx
 
        mov     cx,     Len
        lea     si,     A
@@For:
        lodsw
        call    Show_AX
        mov     ah,     02h
        mov     dl,     ' '
        int     21h
        loop    @@For
 
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        pop     dx
        pop     cx
        pop     si
        pop     ax
        ret
ShowArray       endp
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
end     main
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 14.11.2017 в 17:47.
Angelik вне форума Ответить с цитированием
Старый 14.11.2017, 17:45   #4
Angelik
Новичок
Джуниор
 
Регистрация: 14.11.2017
Сообщений: 6
По умолчанию

Вот что я написала, но я не уверена что правильно
Angelik вне форума Ответить с цитированием
Старый 14.11.2017, 17:50   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

да вроде бы всё хорошо:
dbox1.png

только Вы нашли пример с массивом.
А Вам матрица нужна 3 x 3
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2017, 22:10   #6
Angelik
Новичок
Джуниор
 
Регистрация: 14.11.2017
Сообщений: 6
По умолчанию

model small
.486
LOCALS @@
.stack 256
.data

Rows equ 3
Columns equ 3
iSize equ Rows*Columns

m dw Rows
n dw Columns

Matrix dw iSize dup(?)

asCR_LF db 0dh, 0ah, '$'
asTitle0 db 'Input matrix', '$'
asTitle1 db 'Current matrix', '$'
asTitle2 db 'Result matrix', '$'
asPrompt1 db 'a[ ', '$'
asPrompt2 db ', ', '$'
asPrompt3 db ']= ', '$'

kbMaxLen equ 6+1
.code
Show_AX proc
push ax
push bx
push cx
push dx
push di

mov cx, 10
xor di, di


or ax, ax
jns @@Conv
push ax
mov dx, '-'
mov ah, 2
int 21h
pop ax

neg ax

@@Conv:
xor dx, dx
div cx ; dl = num mod 10
add dl, '0'
inc di
push dx
or ax, ax
jnz @@Conv

@@Show:
pop dx
mov ah, 2
int 21h
dec di
jnz @@Show

pop di
pop dx
pop cx
pop bx
pop ax
ret
Show_AX endp

end main
Angelik вне форума Ответить с цитированием
Старый 14.11.2017, 22:11   #7
Angelik
Новичок
Джуниор
 
Регистрация: 14.11.2017
Сообщений: 6
По умолчанию

А вот так правильно?
Angelik вне форума Ответить с цитированием
Старый 15.11.2017, 07:11   #8
Angelik
Новичок
Джуниор
 
Регистрация: 14.11.2017
Сообщений: 6
По умолчанию

[QUOTE=Serge_Bliznykov;1707894]да вроде бы всё хорошо:

Проверьте пожалуйста, а вот так вот правильно ?
Angelik вне форума Ответить с цитированием
Старый 15.11.2017, 08:18   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Angelik а вы что сами не проверяете когда пишете? Компилятор TASM имеется у вас?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 15.11.2017, 10:17   #10
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..имхо, вот-так будет правильней:
Код:
.386
.model  small
.stack  200h
.data
        Array   dw      00100, 24068, -00033     ; матрица 3х3
                dw      00405, -5432, -00007     ; макс.слово со-знаком = +/- 32767d
                dw     -00696, 02017, -01971     ; ^^^        без-знака = +   65535d

        Len     equ     9             ; длинна матрицы в словах
        crlf    db      13,10,'$'     ; переход новую строку

.code
main:   mov     ax,@data              ;
        mov     ds,ax                 ; настраиваем DS на сегмент данных
 
        call    ShowArray             ; показать текущий массив

        mov     ah,9                  ; перевод строки..
        lea     dx,crlf 
        int     21h
 
        mov     cx,Len                ; длина массива
        lea     si,Array              ; его адрес
@for:   lodsw                         ; берём очередной элемент в АХ
        or      ax,ax                 ; отрицательное???
        jns     @ok                   ; нет!
        and     word ptr [si-2],0     ; иначе: сбросить его в ноль
@ok:    loop    @for                  ; повторить СХ-раз..
 
        call    ShowArray             ; показать получившийся массив
 
        mov     ax,4C00h              ; выход из программы!
        int     21h

;----------- Процедуры ------------------// 
;------ Вывод массива Array на экран
ShowArray       proc
        mov     cx,Len
        lea     si,Array
@prn:   lodsw
        call    ShowAX
        mov     al,','         ; разделитель чисел
        int     29h            ;                       ^
        loop    @prn           ;                       |
        ret                    ; Return to Main -------+
ShowArray       endp
 
;------ Вывод AX на экран со-знаком
ShowAX  proc
        push    cx             ; запомнить регистры
        push    si             ; ^^^
        mov     bx,10          ; система счисления для вывода
        xor     cx,cx          ; CX - счётчик разрядов в числе (пока ноль)

        or      ax,ax          ; число в АХ отрицательное ???
        jns     @next          ; нет!
        push    ax             ; иначе: запомнить его
        mov     al,'-'         ; вывести знак-минуса на экран
        int     29h            ; ^^^
        pop     ax             ; ^^^
        neg     ax             ; ...и сделать из числа положительное.
 
@next:  xor     dx,dx          ; преобразование в формат DEC-ascii
        div     bx             ;
        add     dl,'0'         ;
        push    dx             ;
        inc     cx             ; считаем разряды числа..
        or      ax,ax          ; все разряды преобразовали ???
        jnz     @next          ; Non-Zero...

@show:  pop     ax             ; непосредственный вывод АХ на экран
        int     29h            ;
        loop    @show          ;

        pop     si             ; восстанавливаем регистры
        pop     cx             ;
        ret                    ; возврат..
ShowAX endp

end     main
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблер. Дана прямоугольная матрица. Найти сумму элементов строки с заданным номером Слава33 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 06.05.2016 21:08
Матрица. Задана матрица X[N,N], где N<=15. В каждом столбце матрицы поменять местами минимальный элемент и элемент главной диагона _Marchel_ Паскаль, Turbo Pascal, PascalABC.NET 5 28.11.2015 16:23
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
TurboPascal: граф, матрица смежности и матрица инцидентности. ulala Помощь студентам 0 02.12.2009 10:11
Ассемблер матрица Maks93 Помощь студентам 1 01.09.2009 16:50