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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2013, 19:10   #1
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию Адресация

Здравствуйте, объясните пожалуйста почему
при выводе на консоль в переменной e число - 12928,
а в переменной f - 180892288, а не 128(ebx+2, второй элемент от нуля)?
Код:
#include <stdio.h>
#include <windows.h>

BYTE ar[6] = {1,12,128,50,200,10};
BYTE a, b, c, d;
WORD e;
DWORD f;

void main()
{
__asm
{
mov al, byte ptr ar
mov a, al
lea ebx, ar
mov al, byte ptr [ebx]
mov b, al
mov al, byte ptr [ebx]+3
mov c, al
mov edx , 1
mov al, byte ptr [ebx][edx]+2
mov d, al
mov ax, word ptr [ebx]+2
mov e, ax
mov eax, dword ptr [ebx]+2
mov f, eax
}
printf("%u %u %u %u %u %u\n", a,b,c,d,e,f);

system("pause");
}
Вывод на консоль значений:
1 1 50 50 12928 180892288
Если можно поподробнее.
С Уважением Алексей.

Последний раз редактировалось Stilet; 06.03.2013 в 21:50.
Alexey_68 вне форума Ответить с цитированием
Старый 06.03.2013, 19:18   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

а вот это Вам ни о чем не говорит?
Код:
mov ax, word ptr [ebx]+2
mov e, ax
mov eax, dword ptr [ebx]+2
mov f, eax
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 06.03.2013, 19:20   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Alexey_68, попробуйте все переменные dword`ами объявить.
vadimych вне форума Ответить с цитированием
Старый 06.03.2013, 21:34   #4
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

Цитата:
а вот это Вам ни о чем не говорит?
Код:
mov ax, word ptr [ebx]+2
mov e, ax
mov eax, dword ptr [ebx]+2
mov f, eax
типы данных word 2 байта, dword 4, дальше не ясно откуда 12928 180892288?
На этом остановился...
Alexey_68 вне форума Ответить с цитированием
Старый 06.03.2013, 22:04   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Что-то насчёт двордов херню я сморозил.
Alexey_68, у Вас массив байт, вы кладёте в переменные e и f 2 и 4 байта. Вот и вывод соответственный.
Код:
movzx ax, byte ptr [ebx+2]
mov e, ax
movzx eax, byte ptr [ebx+2]
mov f, eax
vadimych вне форума Ответить с цитированием
Старый 06.03.2013, 22:24   #6
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

я просто подумал что если я кладу в WORD (2 байта по адресу ebx со сдвигом 2)mov ax, word ptr [ebx]+2,
то я получу 2 байта - BYTE ar[6] = {1,12,128,50,200,10};
числа 128 и 50, а DWORD (mov eax, dword ptr [ebx]+2) - 128 50 200 100 четыре байта и
на выводе
12850
12850200100 и в каком отладчике (компилирую codegear c++ 2007)
посмотреть в оле?
Alexey_68 вне форума Ответить с цитированием
Старый 06.03.2013, 22:39   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
я просто подумал что если я кладу в WORD (2 байта по адресу ebx со сдвигом 2)mov ax, word ptr [ebx]+2,
Кто вам сказал, что вы кладете в два байта по адресу в [ebx]+2?
вы в регистр ax загружаете два байта из памяти по данному адресу, в первом из которых находится 128, а во втором 50, т.е. в регистр al попадет 128 (80h), а в регистр ah попадет 50 (32h). А это означает, что в регистре ax находится 3280h = 12928. со второй переменной аналогично, но с поправкой, что там считывается 4 байта...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 06.03.2013, 23:24   #8
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

Цитата:
Кто вам сказал, что вы кладете в два байта по адресу в [ebx]+2?
вы в регистр ax загружаете два байта из памяти по данному адресу, в первом из которых находится 128, а во втором 50, т.е. в регистр al попадет 128 (80h), а в регистр ah попадет 50 (32h). А это означает, что в регистре ax находится 3280h = 12928. со второй переменной аналогично, но с поправкой, что там считывается 4 байта...
Большое спасибо за помощь в решении моего вопроса, смысл понял благодарю.
С Уважением Алексей.
Alexey_68 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ip адресация Якъ Помощь студентам 3 24.07.2012 08:18
WP и адресация... Maksimall89 WordPress и другие CMS 1 10.01.2012 20:03
линейная адресация геннадий522 Visual C++ 1 16.12.2011 19:46
адресация в формулах andrewx Microsoft Office Excel 2 29.06.2009 17:44
StringGrid:=адресация Nemesisking Компоненты Delphi 12 02.03.2007 02:20