Массивы... помогите в написании...

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Oksan4ik
Сообщения: 3
Зарегистрирован: 25 мар 2007, 01:17
Контактная информация:

Помогите пожалуйста начинающей )) :rolleyes:
Нужно написать две программы на asm.... с одномерными и двумерными массивами....

1. Вычислить минимальный элемент массива и его номер.

2. Вычислить сумму элементов матрицы, находящихся над главной диагональю.

:confused:
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Необходимо указать:
1. Для каких процессоров пишется прога (286, 386, 486, 586+MMX и т.д.)
2. Формат элементов массивов - (byte, word, dword, float4, float6 и т.д., знаковые они или нет)
It's a long way to the top if you wanna rock'n'roll
Oksan4ik
Сообщения: 3
Зарегистрирован: 25 мар 2007, 01:17
Контактная информация:

somewhere писал(а):Необходимо указать:
1. Для каких процессоров пишется прога (286, 386, 486, 586+MMX и т.д.)
2. Формат элементов массивов - (byte, word, dword, float4, float6 и т.д., знаковые они или нет)
1. Для 286 процессора... через TASM
2. Выбор формата элементов произвольный, лучше конечно byte или word.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Первая задача
[syntax="Assembler"]
Model tiny
.286
.code
push cs
pop ds
lea si, Array
mov cx, ArrayLength
xor dx, dx ; Element position = 0, position of the first array's element
mov bx, [si] ; Element max value = first element value
add si, 2
dec cx
@Loop:
mov ax, [si]
sub ax, bx
js @less_or_eq ; To compare 2 signed numbers better use it's differention
mov bx, [si] ; A > B only if A - B > 0 => SF = 0
mov dx, si
sub dx, offset Array ; Position = (CurrentOffset - StartOffset)/2
shr dx, 1
@less_or_eq:
add si, 2
loop @Loop

push dx
push bx

mov ah, 9
lea dx, TextLine1
int 21h

pop ax
call _Write_Number_16

mov ah, 9
lea dx, TextCR
int 21h

mov ah, 9
lea dx, TextLine2
int 21h

pop ax
call _Write_Number_16

mov ah, 9
lea dx, TextCR
int 21h

mov ax, 4c00h
int 21h

; ////////////////// Main code ends here

; ////////////////// Write number, entry AX - Number, signed
_write_number_16 proc near
pusha
test ax, ax
jns @not_signed
mov bx, ax
mov dl, '-'
mov ah, 2
int 21h
mov ax, bx
not ax
inc ax
@not_signed:
mov bx,10
xor cx,cx
@wnum_1:
xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz @wnum_1
@wnum_2:
pop dx
add dl,30h
mov ah,2
int 21h
loop @wnum_2
popa
ret
_write_number_16 endp

; ////////////////////// Data
TextLine1 db 'Maximum element value : $'
TextLine2 db 'Element position : $'
TextCR db 13, 10, '$'
ArrayLength dw 10
Array dw -51, -12, -48, 212, -218, 803, -63, 43, 712, 655

end
[/syntax]
Ньюансы - для сравнения двух знаковых чисел считается их разность - если больше нуля, то значит первое больше второго.

Вот вторая, по коду даже меньше:
[syntax="Assembler"]
Model tiny
.286
.code
push cs
pop ds
lea si, Matrix + 1 ; SI = Offset to first summing value
mov cl, MatrixWidth
xor ch, ch
mov di, cx ; DI = Matrix width into DI
dec cx ; CX = Vertical passes = Width - 1
mov bx, cx ; BX = Elements to summ = Width - 1
xor bp, bp ; Summ = 0
@Loop1:
push bx
@Loop2:
mov al, [si]
cbw ; Convert byte to word, IF (bit 7 AL = 1) Then AH = FF Else AH = 0, for more see instruction manual
add bp, ax
inc si
dec bx
jnz @Loop2

pop bx
dec bx
add si, di
sub si, bx
loop @Loop1

mov ah, 9
lea dx, TextLine1
int 21h

mov ax, bp
call _Write_Number_16

mov ah, 9
lea dx, TextCR
int 21h

mov ax, 4c00h
int 21h

; ////////////////// Main code ends here

; ////////////////// Write number, entry AX - Number, signed
_write_number_16 proc near
pusha
test ax, ax
jns @not_signed
mov bx, ax
mov dl, '-'
mov ah, 2
int 21h
mov ax, bx
not ax
inc ax
@not_signed:
mov bx,10
xor cx,cx
@wnum_1:
xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz @wnum_1
@wnum_2:
pop dx
add dl,30h
mov ah,2
int 21h
loop @wnum_2
popa
ret
_write_number_16 endp

; ////////////////////// Data
TextLine1 db 'Element summ : $'
TextCR db 13, 10, '$'
MatrixWidth db 5
Matrix db 070, -09, 011, 063, 015
db -11, -50, -60, 099, 041
db 013, 044, 050, -03, 000
db 000, -31, 108, 031, 031
db 051, 059, 084, -85, 061

end
[/syntax]
Для того, чтобы понять принцип:
1. Сначала позиционируемся на первый суммируемый элемент [1,0]
2. Считаем до конца строки
3. Счетчик элементов для суммирвания уменьшаем на 1
4. Добавляем к текущей позиции (должна быть в начале второй строки, [0,1]) размер матрицы и вычитаем счетчик элементов для суммирвания - попадаем на первый суммир. элемент этой строки.
5. И так далее по всем строкам.

P.S. Я черезстрочно не писал, какой-то глюк с отображением кода наверное
It's a long way to the top if you wanna rock'n'roll
Oksan4ik
Сообщения: 3
Зарегистрирован: 25 мар 2007, 01:17
Контактная информация:

somewhere, большущее СПАСИБО!!! :) буду разбираться!!! ;)
Ответить