Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 03.06.2019, 18:47   #1
SvetlanaBLB
Новичок
 
Регистрация: 03.06.2019
Сообщений: 1
Репутация: 10
По умолчанию Задание в MASM

Подскажите, где у меня неправильно??
задаем матрицу, нужно вывести номера строк, которые образуют убывающую последовательность

Код:
.model small ; Модель памяти
.stack 100h  ; Установка размера стека

.data
rows    dw ?
cols    dw ?
array   db 10*10 dup (?) 
crlf    db 13,10,'$'
aux     db 0
flag    db 0
flas    db 0
mult    db 0
buf db 3,0,3 dup ('$'),'$'
msgPress    db 13,10,'Press...$'
msgRows db 'String (<=10): $'
msgCols db 'Columns (<=10): $'
msgEl   db 13,10,'Input elements: ',13,10,'$'
msgMax  db 13,10,'Row = $'
msgFlag  db 13,10,'Flag = $'
time dd ?
timeMsg db 13, 10, 'Time = $ '

.code
;макрос вывода на экран текстового сообщения
;str - стока для вывода
write macro  str
    push    ax
    push    dx
 
    lea     dx,str  ;адрес строки для вывода
    mov     ah,09h  ;09h функция
    int     21h
 
    pop     dx
    pop     ax
endm
 
;макрос вывода числа на экран
;вход: AX - число для вывода на экран
putdigit macro
    local lput1
    local lput2
    local exx
 
    push ax
    push    cx
    push    -1  ;сохраним признак конца числа
    mov     cx,10   ;делить будем на 10
lput1:  xor     dx,dx   ;чистим регистр dx
    mov     ah,0                   
    div     cl  ;Делим 
    mov     dl,ah   
    push    dx  ;Сохраним цифру
    cmp al,0    ;Остался 0? 
    jne lput1   ;нет -> продолжим
    mov ah,2h
lput2:  pop dx  ;Восстановим цифру
    cmp dx,-1   ;Дошли до конца -> выход 
    je  exx
    add dl,'0'  ;Преобразуем число в цифру
    int 21h ;Выведем цифру на экран
    jmp lput2   ;И продолжим
exx:
    mov dl,' ' 
    int 21h
    pop cx
    pop     ax
endm
 
;макрос ввода числа с клавиатуры
;выход: AX - введенное число
indigit macro
    local   lin
    push    bx
    push    cx
    push    dx
 
    mov     ah,0Ah  ;буферизированный ввод
    lea     dx,buf
    int     21h
 
    xor     ax,ax
    xor     cx,cx
    ;разбор количества цифр введенного числа
    mov     cl,[buf+1]  ;количество реально введенных символов
    xor     di,di
lin:
    mov     dl,10
    mul     dl
    mov     bl,[buf+di+2]
    sub     bl,30h  ;ASCII -> число
    add     al,bl
    inc     di
    loop    lin
 
    pop dx  
    pop     cx
    pop     bx
endm
 
start:
    
    mov     ax,@data
    mov     ds,ax
 
    write msgRows
    indigit
    mov rows,ax
    write crlf  ;принудительно переводим курсор на след. строку
 
    write msgCols
    indigit
    mov cols,ax
    write crlf
 
    write msgEl
;ввод массива
    lea     bx,array
    mov     cx,rows
    
    
    
in1:    ;цикл по строкам
    push    cx
    mov     cx,cols
    mov     si,0
in2:    ;цикл по колонкам
    indigit ;макрос ввода числа
    mov     [bx][si],al
    inc     si
 
    write crlf  
    loop    in2
 
    add     bx,cols
    pop     cx
    loop    in1
    
    ;Перебор матрицы
    lea bx,array
    mov cx,rows
out1:   ;Цикл по строкам
    push cx
    mov cx,cols
    mov si,0
 
    write crlf  
out2:   ;Цикл по столбцам
    xor ax,ax
    mov al,[bx][si] ;добавляем в регистр AL 
    putdigit    ;макрос выхода
    inc si
    loop out2
 
    add bx,cols
    pop cx
    loop out1
 
    ;находим нулевую колонку
    lea bx,array
    xor ax,ax
    mov al,[bx][0]
    mov cx,rows
    mov flas,0
r1: ;цикл по строкам
    push cx
    mov cx,cols
    mov si,0
    mov flag,0
    add flas,1
    mov al,[bx][si]
r2: ;цикл по столбцам
    add si,1
    cmp si,cols
    je l2
    cmp al,[bx][si] 
    jna l2
    add flag,1
    
l2: 
    mov al,[bx][si]
    loop r2
    mov ax, si
    sub al,1
    cmp  flag,al
    je print
print:
    mov ax,bx
    sub al,flas
    write msgMax
    putdigit

    add bx,cols
    pop cx
    loop r1
    ;Результат: Регистр = строка


    mov ax,4c00h ;dos-функция выхода из программы
    int 21h
end start
_____
Код программы нужно выделять (форматировать) тегами [CODE] [/CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 03.06.2019 в 22:35.
SvetlanaBLB вне форума   Ответить с цитированием
Старый 03.06.2019, 19:40   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 414
Репутация: 302
По умолчанию

При обработке матрицы.
Когда обрабатываете строку (цикл по колонкам), то цикл должен выполняться не cols раз, а на 1 меньше - вы же первый элемент исключаете из цикла.
В цикле по колонкам какое-то мутное сравнение и переход для si.
После цикла по колонкам значение флага нужно сравнивать с числом (cols-1).
Выводить нужно номер строки, а вы выводите что-то другое (там какие-то манипуляции с flag и адресом строки в памяти).

Вот ваш код после форматирования, чтобы лучше было видно ошибки
Код:
        ;находим нулевую колонку
        lea     bx, array
        xor     ax, ax
        mov     al, [bx][0]
        mov     cx, rows
        mov     flas,0
        r1:
        ;цикл по строкам
                push    cx
                mov     cx, cols
                mov     si,0
                mov     flag,0
                add     flas, 1
                mov     al, [bx][si]
                r2:
                ;цикл по столбцам
                        add     si, 1
                        cmp     si, cols
                        je      l2
                        cmp     al, [bx][si]
                        jna     l2
                        add     flag, 1

                l2:
                        mov     al, [bx][si]
                loop    r2
                mov     ax, si
                sub     al, 1
                cmp     flag, al
                je      print
        print:
                mov     ax, bx
                sub     al, flas
                write msgMax
                putdigit

                add     bx, cols
                pop     cx
        loop    r1
FPaul вне форума   Ответить с цитированием
Старый 08.08.2019, 06:19   #3
Nif-naf
Форумчанин
 
Аватар для Nif-naf
 
Регистрация: 05.09.2016
Сообщений: 69
Репутация: -47
По умолчанию

Where do you? What is error list?
__________________
Немного о GoAsm.
Nif-naf вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
masm Serjuk Assembler 3 09.08.2019 07:04
Задание на проверку.Задание:Изменить порядок следования элементов массива на обратный. Valiev1 Помощь студентам 1 26.10.2015 21:06
MASM 6.11 Gtnz8 Assembler 3 12.12.2012 13:42
Запутаное задание задание с массивом.Буду очень благодарен. Riko1 Общие вопросы C/C++ 2 22.10.2011 10:23


08:54.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.