Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2016, 14:48   #1
jekos1
Новичок
Джуниор
 
Регистрация: 07.03.2016
Сообщений: 3
По умолчанию поменять элементы массива местами

добрый день. необходимо поменять местами соседние элементы 10-элементного массива слов. решил писать тупо в лоб и максимально просто(ничего не знаю потому что)
когда переношу первый элемент массива в ax, то всё идёт как по маслу.
пытаюсь всунуть второй элемент массива в bx, но вместо предполагаемой семёрки туда влазит 700h
т.е если верно понимаю, семерка записалась в bh. в итоге программа пошла коту под хвост. и мне интересно почему так вышло. мб мое предположение неверно, мб я дебик. поясните, пожалуйста :D
Код:
data segment
mass dw 5,7,50,9,1,0,33,12,13,41
data ends
stk segment stack
   db 256 dup ("?")
stk ends
code segment
assume cs: code, ds: data,ss:stk
start: 	
mov ax, data
mov ds, ax 		; Загрузить сегментный адрес данных
lea si, mass 	        ; Загрузить адрес смещения массива

mov ax,[si] 
inc si
mov bx,[si] 
dec si
mov [si],bx 
inc si
mov [si],ax 
inc si

mov ax,[si] 
inc si
mov bx,[si] 
dec si
mov [si],bx 
inc si
mov [si],ax 
inc si

mov ax,[si] 
inc si
mov bx,[si] 
dec si
mov [si],bx 
inc si
mov [si],ax 
inc si

mov ax,[si] 
inc si
mov bx,[si]
dec si
mov [si],bx 
inc si
mov [si],ax 
inc si

mov ax,[si] 
inc si
mov bx,[si] 
dec si
mov [si],bx 
inc si
mov [si],ax
inc si
		
quit:	mov ax,4C00h 	; Код завершения 0
int 21h 		; Выход в DOS
code ends
end start
вместо бесконечных inc сперва писал [si+n], где n - какое-либо нужное мне натуральное число. но я забраковал, потому что была ошибка(такая же или нет - не помню)
товарищи программисты. пожалуйста. помогите разобраться ;D

Последний раз редактировалось jekos1; 07.03.2016 в 14:59.
jekos1 вне форума Ответить с цитированием
Старый 07.03.2016, 16:06   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
mov ax, [si] 
mov bx, [si + 2]
mov [si], bx
mov [si + 2], ax 
ADD si, 4
f.hump вне форума Ответить с цитированием
Старый 07.03.2016, 17:41   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

jekos1,
Если задействовать 32-битные регистры, то можно сразу читать в EAX по-два слова.
Остаётся поменять слова местами и записать EAX обратно в массив.
Рулить здесь будут команды LODSD/STOSD/ROL, и длина массива.
Команды LODS/STOS (B/W/D) удобны тем, что автоматом увеличивают указатели ESI/EDI.

LODSD - читает в EAX двойное слово из адреса ESI;
STOSD - пишет двойное слово из EAX в адрес EDI;
ROL - выталкивает старший(левый) бит, в младший(правый), указанное кол-во раз.

В итоге получаем такой код на FASM'e:

Код:
org 100h
jmp  start

mass  dw  5, 7, 50, 9, 1, 0, 33, 12, 13, 41
mLen  =   ($ - mass) / 4     ; длина массива (в двойных словах)

start:  
   mov   esi, mass         ; ESI = адрес массива для LODSD
   mov   edi, esi          ; EDI = адрес массива для STOSD

   mov   ecx, mLen         ; EСХ = длина массива (повторы цикла)
@@:   
   lodsd                   ; EAX = первая пара цифр (00050007)
   rol   eax, 16           ; меняем их местами (00070005)
   stosd                   ; записываем EAX обратно в массив
   loop  @b                ; мотаем цикл СХ-раз...

   mov   ax, 4c00h
   int   21h
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 07.03.2016, 19:21   #4
jekos1
Новичок
Джуниор
 
Регистрация: 07.03.2016
Сообщений: 3
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
а на TASM это реализуемо? насколько я помню(или не помню), там нет 32 битных регистров.
да и инструкций похожих я не нашёл.
jekos1 вне форума Ответить с цитированием
Старый 07.03.2016, 19:23   #5
jekos1
Новичок
Джуниор
 
Регистрация: 07.03.2016
Сообщений: 3
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
Код:
mov ax, [si] 
mov bx, [si + 2]
mov [si], bx
mov [si + 2], ax 
ADD si, 4
чуть-чуть логику можете пояснить?
даже если это верно(сейчас проверю), то почему? ; заработало.благодарю. но всё равно интересно как это устроено. если не составит труда, поясните

Последний раз редактировалось jekos1; 07.03.2016 в 19:29.
jekos1 вне форума Ответить с цитированием
Старый 07.03.2016, 19:39   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

32-битные регистры поддерживает не ТАСМ, а процессор.
Инструкции есть такие, значит плохо искал.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 07.03.2016, 19:40   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а че тут пояснять?

это твой проход влоб с правильным размером элемента массива (2 байта).
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поменять местами элементы массива CkooTuHa Помощь студентам 1 18.12.2014 17:08
Найти минимальный и максимальный элементы массива Х и поменять их в массиве местами. Элементы массива вычисляются по формуле Xi=(( Милашечка Помощь студентам 0 26.05.2013 13:01
Поменять местами элементы массива Pascal olga_v95 Помощь студентам 2 19.03.2013 23:04
Поменять местами элементы одномерного массива McFrey Помощь студентам 8 08.12.2011 23:03