 |
Ассемблер в примерах - Перестановка элементов массива
- Вопрос:
- произвести попарные перестановки элементов одномерного массива : первый элемент поменять местами с последним, второй с предыдущим, и так все остальные. Тип элементов в массиве байтовый.
- Ответ:
-
Пример окна программы
Исходный массив:
54 46 -122 -66 86 -50 -90 94 118 110
Измененный массив:
110 118 94 -90 -50 86 -66 -122 46 54
Press any key ...
А простейшая программа, делающая это - в приложении
.model tiny ; COM-файл
.386
.code
org 100h
start:
mov ax, 3
int 10h
; по-максимуму оставлю как и "в том" ответе
; Не написали, как вводить массив - заполню псевдослучайными (на автомат!!)
; прочитаем текущие тики в качестве затравки
; получается типа RANDOMIZE в Паскале
mov CX, 50 ; будем использовать цикл - настроим СХ
push es
push 040h
pop es
mov DX, es:[6ch]
pop es
; заполнение
lea si, ar
mov cx, ar_len
fill_random:
imul DX, 4e35h
mov [si], dl
inc SI
LOOP fill_random
; покажем, воспринимая числа как знаковые
lea dx, msg_src
mov ah, 9
int 21h
lea si, ar
mov cx, ar_len
cld
@@_show_next_01:
lodsb
cbw ; я написал процедуру для слов, а здесь байты -> Convert Byte to Word
CALL WriteWordDEC_signed
; два пробела для разделения
mov al, ' '
int 29h
int 29h
LOOP @@_show_next_01
lea si, ar
mov di, si
mov cx, ar_len
add di, cx
dec di
shr cx, 1
@@_swap:
mov al, [si]
mov ah, [di]
mov [di], al
mov [si], ah
inc si
dec di
LOOP @@_swap
; Измененный
lea dx, msg_dst
mov ah, 9
int 21h
lea si, ar
mov cx, ar_len
cld
@@_show_next:
lodsb
cbw ; я написал процедуру для слов, а здесь байты -> Convert Byte to Word
CALL WriteWordDEC_signed
; два пробела для разделения
mov al, ' '
int 29h
int 29h
LOOP @@_show_next
@@_exit:
lea dx, PressKey
mov ah,9
int 21h
xor ax, ax
int 16h
int 20h
writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
push ax
push bx
push dx
push cx
mov bx, 10
xor cx, cx
@@1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz @@1
@@2:
pop ax
add al, '0'
int 29h
LOOP @@2
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp
WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
or ax, ax
jns @@_no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax ; изменение знака на +
@@_no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp
PressKey db 13,10,'Press any key ...$'
msg_src db 'Исходный массив: ',13,10,'$'
msg_dst db 13,10,'Измененный массив:',13,10,'$'
ar_len equ 10 ; так объявляются константы - здесь длина массива
ar db ar_len dup (?)
end start
|  |