Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
1

Максимальный отрицательный элемент

26.11.2009, 19:13. Просмотров 2621. Ответов 22
Метки нет (Все метки)

Помогите пожалуйста написать задачку в Tasm. Найти максимальный отрицательный элемент в матрице 3х4 чисел размером в байт.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 19:13
Ответы с готовыми решениями:

Найти максимальный отрицательный элемент в одномерном массиве
Задание: Найти максимальный отрицательный элемент в одномерном массиве. Массив задается в...

Найти максимальный отрицательный элемент в одномерном массиве (массив ввести с клавиатуры)
Найти максимальный отрицательный элемент в одномерном массиве(массив ввести с клавиатуры). Как...

Найти наибольший отрицательный элемент массива
Дан массив целых двухбайтных чисел со знаком размерности N. Используя строковые операции,написать...

В матрице поменять местами строку, содержащую минимальный элемент, со строкой, содержащей максимальный элемент
В произвольной матрице i=1, M , j=1, N поменять местами строку, содержащую минимальный элемент, со...

Максимальный элемент
Помогите ,пожалуйста....очень срочно нужно зачёт получить, а лабы не сделаны(( Буду вам...

22
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
27.11.2009, 16:54  [ТС] 2
Или хотя бы как осуществить алгоритм поиска отрицательного элемента на асме? элементы в матрице любыесрочно надо сдавать
0
Goodwin98
2525 / 821 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
27.11.2009, 18:28 3
Алгоритм точно такой же, как и на любом другом языке.
Берем первый элемент, проверяем его знак (можно проверить крайний бит, можно просто воспользоваться тем, что установится/неустановится флаг SF и делать переход типа js, можно сравнить с нулем).
Если он отрицательный, то сохраняем его как максимальный.
Берем следующий, проверяем его, и сохраняем его, если он больше. Повторяем, пока не пройдет вся матрица(3x4 = 12 элементов).
0
bezmozga
6 / 6 / 0
Регистрация: 29.10.2009
Сообщений: 26
27.11.2009, 21:40 4
Сделал код. Не хватило времени оптимизировать. Сделай если что сам.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 ;Помогите пожалуйста написать задачку в Tasm. 
;Найти максимальный отрицательный элемент в матрице 
;   3х4 чисел размером в байт
STAK SEGMENT STACK
    db 256 dup(?)
STAK ENDS
DATA SEGMENT 
        MATX db 5d, 45d, 120, -2d           ; nasha matrica
             db 0d,  32d, 150d, 4d
             db 5d,  43d, -50d, -10d
        lenMATX equ $-MATX                  ; kolichestvo elementov v nashei matrice
DATA ENDS
; Ne zabyvai pro diapozon otr-x chisel
CODE SEGMENT
            ASSUME CS:CODE,DS:DATA,SS:STAK
;----------------------
; F-iya opredelayet maximalnoe iz 2x 
; otricatelnyx chisel
; na vxode - v ah - 1-e chislo, v al - vtoroe
; na vyxode - v ah - maximalnoe otr chislo
;----------------------
maxNegNum proc
LOCAL
        cmp ah, 0               ; 
        jns @@positiveNumber
        cmp ah, al
        jnb @@exit              ; ah >= al 
    ; ah < al
        mov ah, al              ; v ah teper max otr chislo
@@exit:
        ret
@@positiveNumber:
        mov ah, al
        ret
maxNegNum endp
;----------------------
; Funkciya reaspechatyvaet chislo so znakom
; na vxode: v al - chilo
; na vyxode na konsoli chislo
;----------------------
printSignByte proc
LOCAL
        push ax
        push bx
        push cx
        push dx
    
        xor cx, cx          ; cx=0 - schetchik chisel v stacke
        xor ah, ah          ; ah=0 na vsykyi sluchai
        mov bx, 10d
        cmp al, 0
        je @@NULL           ; osobyi sluchai vremeni net
        cmp al, 0
        jns @@NoNegative
@@negative:
        push ax
        mov ah, 02h
        mov dl, '-'
        int 21h
        pop ax
        neg al              ; delaem pologitelnoe chislo
@@NoNegative:
        xor dx, dx          ; dx=0
        cmp ax, 0d          ; esli rezultat = 0 to
        je @@printNumber    
        div bx              ; dx:ax / 10d
        push dx             ; soxranyaem v stacke ostatok
        inc cx              ; uvelichivaem schetchik chisel v stacke
        jmp @@NoNegative
@@printNumber:
        pop dx              ; raspechatyvaem ostatok
        add dl, '0'
        mov ah, 02h
        int 21h
        loop @@printNumber
@@exit1:
        pop dx
        pop cx
        pop bx
        pop ax
        ret
@@NULL:
        mov ah, 02h
        mov dl, '0'
        int 21h
        jmp @@exit1
printSignByte endp
start:
    ; nastroika registra ds
        mov ax, DATA
        mov ds, ax
 
        mov cx, lenMATX                     ; kolichestvo elementov v matrice
        mov bx, offset MATX                 ; adress nasala matricy ds:bx
        mov ah, 1d                          ; logim v ah - pologitelnoe chislo
@@loop1:
        cmp cx, 0d
        je print
        mov al, byte ptr [bx]               ; peresylaem v al sledyushyi element
        cmp al, 0                           ; delaem chtob izmenit flag znaka
        jns @@label1                        ; pologitelnoe chislo
    ; otricatelnoe chislo
        call maxNegNum
@@label1:
        dec cx                              ; cx-1
        inc bx                              ; bx+1
        jmp @@loop1     
print:
        cmp ah, 0
        jns exit                                ; net Otricatelnogo chisla
        mov al, ah
        call printSignByte
exit:
        mov ax, 4C00h
        int 21h
CODE ENDS
end start
У меня работает на УРА.
0
27.11.2009, 21:40
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
28.11.2009, 18:38  [ТС] 5
Спасибо,попробую разобраться. я на асме новичок. а почему при объявлении элементов матрицы пишется d?
Assembler
1
2
3
4
MATX db 5d, 45d, 120, -2d                       ; nasha matrica
        db     0d,  32d, 150d, 4d
        db 5d,  43d, -50d, -10d
        lenMATX equ $-MATX
0
Goodwin98
2525 / 821 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
28.11.2009, 19:00 6
Цитата Сообщение от Kotta Посмотреть сообщение
почему при объявлении элементов матрицы пишется d?
Это означает, что числа десятичные.
0
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
30.11.2009, 20:48  [ТС] 7
спасибо.программа работает, но смущает ответ. "-2".разве максимальный отрицательный элемент не "-50"
0
Goodwin98
2525 / 821 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
30.11.2009, 20:57 8
Это уже математика. Самое большое из отрицательных чисел здесь - это "-2", а "-50" наоборот самое маленькое.
0
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
30.11.2009, 21:07  [ТС] 9
Точно.школьная программа). у меня еще одна проблема. хочу вывести исходную матрицу на экран, но вместо отрицательных чисел, выводятся одни закорючки

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;вывод на экран исходного массива
    mov ah,09h
    lea dx,Array
    int 21h
    mov cx,12
    mov si,0
 
;вывод значений исходной матрицы
   show_primary:
    mov dl,mas[si]
    add dl,30h
    mov ah,02h
    int 21h
 
    mov dl,9    ;табуляция
    int 21h
 
    inc si
    add si,2
    loop show_primary
думаю здесь много чего неправильно. не понимаю как вывести на экран матрицу с отрицательными числами?
0
Orwomoi
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
01.12.2009, 04:21 10
Во-первых,
Assembler
1
2
3
 mov ah,09h
        lea dx,Array
        int 21h
Разве Array массив ASCII символов? Разве он заканчивается символом '$'?

Во-вторых,
Assembler
1
2
3
4
        mov dl,mas[si]
        add dl,30h
        mov ah,02h
        int 21h
Так просто будет работать только с числами от 0 до 9.
Если надо вывести числа от 0 до 0FFh, тогда распаковывай, прибавляй 30h и еще 7 к числам от 0Ah до 0Fh, только после этого можно выводить.
Если же надо вывести десятичные цифры, тогда конвертируй шестнадцатиричные десятичные, прибавляй 30h, и если знаковый байт равен 1, нарисуй перед цифрой '-'.
0
bezmozga
6 / 6 / 0
Регистрация: 29.10.2009
Сообщений: 26
02.12.2009, 15:31 11
вот функция которая распечатывает матрицу. Добавь ее после строчки printSignByte endp
и пользуйся.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
;-------------------------------------
;-------------------------------------
showMatrix proc
; vyvod matricy na ecran
        xor bx, bx                          ; bx= 0 v nem xranu N stroki
@@loop2:                                    ; begim po strochke
        cmp bx, [lenMATX]                   ; ne vybegali li za matricu?
        je @@exit_for_@@loop2               ;
        xor di, di                          ; di = 0 stolbec 
    @@loop3:                                ; raspechatyvaem kagdyi element
        cmp di, 4d                          ; proveryaem: ne vyshli za stolbcy|?
        je @@exit_for_@@loop3
    ;--------------------------
        mov al, MATX[bx][di]                ; sledyushyi element matricy
        call printSignByte                  ; raspechatyvaem ego
    ;--------------------------
        inc di                              ; sled strolbec
        mov ah, 02h                         ; nomer funlkcii
        mov dl, 09h                         ; kod tabulyacii
        int 21h                             ; raspechatka cherez tabul
        jmp @@loop3                         ;
    @@exit_for_@@loop3:                     ;
        add bx, 4d                          ; sledyushaya strochka
        mov ah, 02h                         ; nomer funlkcii
        mov dl, 0Dh                         ; vozvrashaem karetku nazad
        int 21h
        mov dl, 0Ah                         ; na sled strochku perexodim
        int 21h
        jmp @@loop2
@@exit_for_@@loop2:
        ret
showMatrix endp
;-------------------------------------
;-------------------------------------
Будь внимательней, так как она в своем теле меняет регистры.
0
bezmozga
6 / 6 / 0
Регистрация: 29.10.2009
Сообщений: 26
02.12.2009, 19:51 12
Вот код, добавь его после строчки printSignByte endp.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
showMatrix proc
; vyvod matricy na ecran
        push ax
        push bx
        push dx
        push di
        xor bx, bx                          ; bx= 0 v nem xranu N stroki
@@loop2:                                    ; begim po strochke
        cmp bx, [lenMATX]                   ; ne vybegali li za matricu?
        je @@exit_for_@@loop2               ;
        xor di, di                          ; di = 0 stolbec 
    @@loop3:                                ; raspechatyvaem kagdyi element
        cmp di, 4d                          ; proveryaem: ne vyshli za stolbcy|?
        je @@exit_for_@@loop3
    ;--------------------------
        mov al, MATX[bx][di]                ; sledyushyi element matricy
        call printSignByte                  ; raspechatyvaem ego
    ;--------------------------
        inc di                              ; sled strolbec
        mov ah, 02h                         ; nomer funlkcii
        mov dl, 09h                         ; kod tabulyacii
        int 21h                             ; raspechatka cherez tabul
        jmp @@loop3                         ;
    @@exit_for_@@loop3:                     ;
        add bx, 4d                          ; sledyushaya strochka
        mov ah, 02h                         ; nomer funlkcii
        mov dl, 0Dh                         ; vozvrashaem karetku nazad
        int 21h
        mov dl, 0Ah                         ; na sled strochku perexodim
        int 21h
        jmp @@loop2
@@exit_for_@@loop2:
 
        pop di
        pop dx
        pop bx
        pop ax
        ret
showMatrix endp
1
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
03.12.2009, 01:47  [ТС] 13
Вот вся программа. как вы говорили,сделала:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
STAK SEGMENT STACK
        db 256 dup(?)
STAK ENDS
 
data segment 
                MATX db 5d, 45d, 120, -2d                       ; nasha matrica
                         db     0d,  32d, 150d, 4d
                         db 5d,  43d, -50d, -10d
                lenMATX equ $-MATX                                      ; kolichestvo elementov v nashei matrice
data ends
 
; Ne zabyvai pro diapozon otr-x chisel
CODE SEGMENT
                        ASSUME CS:CODE,DS:DATA,SS:STAK
;----------------------
; F-iya opredelayet maximalnoe iz 2x 
; otricatelnyx chisel
; na vxode - v ah - 1-e chislo, v al - vtoroe
; na vyxode - v ah - maximalnoe otr chislo
;----------------------
maxNegNum proc
LOCAL
                cmp ah, 0                               ; 
                jns @@positiveNumber
                cmp ah, al
                jnb @@exit                              ; ah >= al 
        ; ah < al
                mov ah, al                              ; v ah teper max otr chislo
@@exit:
                ret
@@positiveNumber:
                mov ah, al
                ret
maxNegNum endp
;----------------------
; Funkciya reaspechatyvaet chislo so znakom
; na vxode: v al - chilo
; na vyxode na konsoli chislo
;----------------------
printSignByte proc
LOCAL
                push ax
                push bx
                push cx
                push dx
        
                xor cx, cx                      ; cx=0 - schetchik chisel v stacke
                xor ah, ah                      ; ah=0 na vsykyi sluchai
                mov bx, 10d
                cmp al, 0
                je @@NULL                       ; osobyi sluchai vremeni net
                cmp al, 0
                jns @@NoNegative
@@negative:
                push ax
                mov ah, 02h
                mov dl, '-'
                int 21h
                pop ax
                neg al                          ; delaem pologitelnoe chislo
@@NoNegative:
                xor dx, dx                      ; dx=0
                cmp ax, 0d                      ; esli rezultat = 0 to
                je @@printNumber        
                div bx                          ; dx:ax / 10d
                push dx                         ; soxranyaem v stacke ostatok
                inc cx                          ; uvelichivaem schetchik chisel v stacke
                jmp @@NoNegative
@@printNumber:
                pop dx                          ; raspechatyvaem ostatok
                add dl, '0'
                mov ah, 02h
                int 21h
                loop @@printNumber
@@exit1:
                pop dx
                pop cx
                pop bx
                pop ax
                ret
@@NULL:
                mov ah, 02h
                mov dl, '0'
                int 21h
                jmp @@exit1
printSignByte endp
 
 
 
showMatrix proc
; vyvod matricy na ecran
                push ax
                push bx
                push dx
                push di
                xor bx, bx                                                      ; bx= 0 v nem xranu N stroki
@@loop2:                                                                        ; begim po strochke
               cmp bx, [lenMATX]                                     ; ne vybegali li za matricu?
                je @@exit_for_@@loop2                           ;
                xor di, di                                                      ; di = 0 stolbec 
        @@loop3:                                                                ; raspechatyvaem kagdyi element
                cmp di, 4d                                                      ; proveryaem: ne vyshli za stolbcy|?
                je @@exit_for_@@loop3
        ;--------------------------
                mov al, MATX[bx][di]                            ; sledyushyi element matricy
                call printSignByte                                      ; raspechatyvaem ego
        ;--------------------------
                inc di                                                          ; sled strolbec
                mov ah, 02h                                                     ; nomer funlkcii
                mov dl, 09h                                                     ; kod tabulyacii
                int 21h                                                         ; raspechatka cherez tabul
                jmp @@loop3
                                                     ;
@@exit_for_@@loop3:                                             ;
                add bx, 4d                                                      ; sledyushaya strochka
                mov ah, 02h                                                     ; nomer funlkcii
                mov dl, 0Dh                                                     ; vozvrashaem karetku nazad
                int 21h
                mov dl, 0Ah                                                     ; na sled strochku perexodim
                int 21h
                jmp @@loop2
@@exit_for_@@loop2:
 
                pop di
                pop dx
                pop bx
                pop ax
                ret
showMatrix endp
                    
 
 
start:
        ; nastroika registra ds
                mov ax, DATA
                mov ds, ax
 
                mov cx, lenMATX                                         ; kolichestvo elementov v matrice
                mov bx, offset MATX                                     ; adress nasala matricy ds:bx
                mov ah, 1d                                                      ; logim v ah - pologitelnoe chislo
@@loop1:
                cmp cx, 0d
                je print
                mov al, byte ptr [bx]                           ; peresylaem v al sledyushyi element
                cmp al, 0                                                       ; delaem chtob izmenit flag znaka
                jns @@label1                                            ; pologitelnoe chislo
        ; otricatelnoe chislo
                call maxNegNum
@@label1:
                dec cx                                                          ; cx-1
                inc bx                                                          ; bx+1
                jmp @@loop1             
print:
                cmp ah, 0
                jns exit                                                                ; net Otricatelnogo chisla
                mov al, ah
                call printSignByte
exit:
                mov ax, 4C00h
                int 21h
CODE ENDS
end start
но выдает одну ошибку на строке 102 : [Constant] assument to mean immediate constant

Если убираю квадратные скобки
Assembler
1
2
3
4
@@loop2:                                                      ; begim po strochke
                cmp bx, lenMATX                                     ; ne vybegali li za matricu?
                je @@exit_for_@@loop2                           ;
                xor di, di
то программа работает без ошибок,выводится ответ "-2", а самой матрицы нету
0
bezmozga
6 / 6 / 0
Регистрация: 29.10.2009
Сообщений: 26
03.12.2009, 17:57 14
добавь после
Assembler
1
2
3
                ; nastroika registra ds
                mov ax, DATA
                mov ds, ax
такие строчки
Assembler
1
         call showMatrix
1
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
03.12.2009, 21:13  [ТС] 15
Ой,спасибо!!! все работает!!!! вы меня очень выручили)))
0
Kotta
1 / 1 / 0
Регистрация: 26.11.2009
Сообщений: 21
06.12.2009, 21:38  [ТС] 16
Можно ли эту программу переделать к виду :
Assembler
1
2
3
4
5
6
model small
.stack 100h
.data
start:
..........
end start
не знаю как правильно называется)

пыталась переделать но ругается на DATA
Assembler
1
2
3
4
start:
        ; nastroika registra ds
                mov ax, DATA
                mov ds, ax
0
alexcoder
1848 / 718 / 150
Регистрация: 03.06.2009
Сообщений: 4,378
Завершенные тесты: 1
06.12.2009, 22:31 17
mov ax,@data
0
антибой
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 28
02.06.2015, 15:53 18
Простите,а можно перевести в мнемокоды сообщение от bezmozga,а то я не могу ничего понять((((
0
антибой
0 / 0 / 0
Регистрация: 04.05.2015
Сообщений: 28
12.12.2015, 11:04 19
bezmozga, Даны три массива(которые задаются адресом первого элемента и длиной).Нужно написать программу для нахождения максимального отрицательного элемента в каждом массиве и вывести среднее арифметическое этих элементов...у меня есть начало программы(т.е. основная программа):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RD #85
WR R1
RD #14
WR R2
CALL M
WR R6
RD #100
WR R1
RD #4
WR R2
CALL M
WR R7
RD #110
WR R1
RD #9
WR R2
CALL M
ADD R7
ADD R6
DIV #3
OUT
HLT
а как быть с подпрограммой???помогите пожалуйста

в методичке есть пример для нахождения среднего арифметического максимальных элементов этих матриц...
Вот основная программа
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RD #85
WR R1
RD #14
WR R2
CALL M
WR R6
RD #100
WR R1
RD #4
WR R2
CALL M
WR R7
RD #110
WR R1
RD #9
WR R2
CALL M
ADD R7
ADD R6
DIV #3
OUT
HLT
А вот подпрограмма
Assembler
1
2
3
4
5
6
7
8
9
10
M: RD @R1
WR R3
L2: RD @R1+
WR R4
SUB R3
JS L1
MOV R3,R4
L1: JRNZ R2,L2
RD R3
RET
0
Mikl___
Автор FAQ
13486 / 6417 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
14.12.2015, 08:48 20
антибой,
а, наверное, очень сложно создать тему в разделе "Assembler: i8080/8085/KP580" ?
0
14.12.2015, 08:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2015, 08:48

Максимальный элемент
Помогите пожалуйста!...нужно переделать эту программу так чтобы из каждой строки был выбран...

Максимальный элемент строки
Подскажите почему не запускает? Я так понял что то не так тут cmp al,A .model small .stack...

Максимальный элемент массива
Не получается найти максимальный элемент ( mov al,mas maxel: cmp al,mas jge m1 inc...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru