Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Перестановка элементов массива

Вопрос:
произвести попарные перестановки элементов одномерного массива : первый элемент поменять местами с последним, второй с предыдущим, и так все остальные. Тип элементов в массиве байтовый.

Ответ:
Пример окна программы
Исходный массив:
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


   Вперёд
   Содержание