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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2016, 13:28   #1
greenblue
Пользователь
 
Регистрация: 02.02.2016
Сообщений: 10
По умолчанию Возможно ли элементы массива поместить в регистр?

Здравствуйте уважаемые участники. Недавно начал изучать язык ассемблера и столкнулся с задачей. При попытке поместить элемент(элементы) массива в регистр в нем(регистре EAX) наблюдается значение 00403000 откуда и почему оно появилось, а не 0000009A?
Исходный код программы:
Код:
TITLE
;Author:
;Create:
;Date  :
;Changes:

INCLUDE     ...\Irvine32.inc
INCLUDELIB ...\Irvine32.lib
INCLUDELIB ...\kernel32.lib
INCLUDELIB ...\user32.lib
.const
text3  EQU     <mov eax,a2>
a3 = 09Ah

.data                         ;[a1]    [a1+1] [a1+2] [a1+3] адреса + байты
a1 BYTE 4d DUP (a3)    ;09Ah,  09Ah,   09Ah,  09Ah 
a2 DWORD a1

.code
main PROC
     mov eax,0
     mov ebx,0
     mov ecx,0
     mov edx,0

     text3

     call DumpRegs
     call WaitMsg

main ENDP
END main
В консоли в регистре EAX значение 00403000

Последний раз редактировалось greenblue; 02.02.2016 в 16:10.
greenblue вне форума Ответить с цитированием
Старый 02.02.2016, 16:01   #2
greenblue
Пользователь
 
Регистрация: 02.02.2016
Сообщений: 10
По умолчанию

Дополню вопрос
"Можно ли отобразить все элементы массива (4шт) во все байты (4шт) регистра EAX?"
т.е. Значение первого байта массива в младший байт регистра, Значение второго байта массива в более старший байт регистра и тд? Таким образом заполнить 4 байта EAX значениями четырех байтов массива, или это невозможно?
(что бы содержание регистра EAX было 9A9A9A9A)

Последний раз редактировалось greenblue; 02.02.2016 в 16:12. Причина: Уточнение(дополнение)
greenblue вне форума Ответить с цитированием
Старый 02.02.2016, 16:13   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
При попытке поместить элемент(элементы) массива в регистр в нем(регистре EAX) наблюдается значение 00403000 откуда и почему оно появилось, а не 0000009A?
Потому что вы кладете адрес
p51x вне форума Ответить с цитированием
Старый 02.02.2016, 16:17   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от greenblue Посмотреть сообщение
значение 00403000 откуда и почему оно появилось, а не 0000009A?
Значение 00403000h похоже на адрес, ибо 00400000h -- типичная IMAGE_BASE exe-файла. Имя переменной в ассемблере по умолчанию трактуется как адрес, а чтобы получить значение, нужно задать размерность (и использовать модификатор ptr в некоторых ассемблерах), или использовать квадратные скобки:
Код:
MOV EAX, dword a1 ; dword ptr a1
; или
MOV EAX, [a1]
Vapaamies вне форума Ответить с цитированием
Старый 02.02.2016, 16:29   #5
greenblue
Пользователь
 
Регистрация: 02.02.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Значение 00403000h похоже на адрес, ибо 00400000h -- типичная IMAGE_BASE exe-файла. Имя переменной в ассемблере по умолчанию трактуется как адрес, а чтобы получить значение, нужно задать размерность (и использовать модификатор ptr в некоторых ассемблерах), или использовать квадратные скобки:
Код:
MOV EAX, dword a1 ; dword ptr a1
; или
MOV EAX, [a1]

Спасибо, про квадратные скобки знаю- что это адрес, дело в том, что если проверяю адрес [a1] (в своем исходном коде), то по этому адресу находится первый элемент массива. Так как идентификатор массива относиться только к первому его элементу.
Но при проверке содержимого переменной [a2] в строке
Код:
 a2 DWORD a1
значение в ней (переменной адрес 00403000), непонятно почему, а не адрес первого элемента а1 массива, который инициализирую строкой a2 DWORD a1.
При коде
Код:
 MOVzx EAX, [a1]
В младший байт регистра EAX поместиться только первый элемент по адресу [a1], остальные байты дополнятся нулями.
Можно заполнить младшую часть регистра EAX, как запись в AH и AL
Код:
mov ah,[a1]
mov al,[a1+1]
Тогда в EAX 00009A9A.
А как заполнить все байты регистра EAX всеми элементами массива, что бы было EAX = 9A9A9A9A, или так невозможно?

Последний раз редактировалось greenblue; 03.02.2016 в 08:26. Причина: дополнение
greenblue вне форума Ответить с цитированием
Старый 02.02.2016, 16:52   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну вам же показали: задать размерность dword или dword ptr
p51x вне форума Ответить с цитированием
Старый 02.02.2016, 18:55   #7
greenblue
Пользователь
 
Регистрация: 02.02.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну вам же показали: задать размерность dword или dword ptr
Извиняюсь за невнимательность
Получилось через
Код:
 mov eax,dword ptr a1
Все байты EAX заполнены 9A9A9A9A

Vapaamies спасибо, что подсказали
p51x спасибо за объяснение и указание

Последний раз редактировалось greenblue; 02.02.2016 в 18:59. Причина: дополнено
greenblue вне форума Ответить с цитированием
Старый 14.02.2016, 11:58   #8
greenblue
Пользователь
 
Регистрация: 02.02.2016
Сообщений: 10
По умолчанию

Код:
.const
a3 = 9Ah
.data
alab LABEL DWORD
a1 BYTE 4 DUP (a3)

.data?

.code
main PROC
     mov eax,0h
     mov eax,[alab]  ;9A9A9A9A eax

     call DumpRegs
     call WaitMsg

main ENDP
END main
greenblue вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти минимальный и максимальный элементы массива Х и поменять их в массиве местами. Элементы массива вычисляются по формуле Xi=(( Милашечка Помощь студентам 0 26.05.2013 13:01
Для матрицы и массива (заданы номера столбцов) найти минимальные элементы, поместить в массив, найти сред. ариф.(Delphi) nucweapon Помощь студентам 5 26.10.2011 09:37
Поместить элементы Одного массива, в начало другого в обратном порядке. Adrenalin4 Общие вопросы C/C++ 2 15.11.2010 21:51
Построить массив, в который поместить все элементы второго массива, оканчивающиеся на цифру 5 Паскалька^^ Паскаль, Turbo Pascal, PascalABC.NET 11 07.01.2009 02:54