Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
vladimashev
0 / 0 / 0
Регистрация: 20.06.2017
Сообщений: 11
1

Операнд, как разность имен

01.06.2019, 02:03. Просмотров 1106. Ответов 3
Метки нет (Все метки)

Assembler
1
2
3
x db 10
y db 40
mov eax, x - y
В результате в eax оказывается значение -1, как разность адресов x и у. Не понимаю: почему в данном случае вычитаются адреса, ведь это же переменные, у них есть значения.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2019, 02:03
Ответы с готовыми решениями:

В текстовом файле c именем FN1 дана домашняя работа третьеклассника в формате: <операнд><знак><операнд>=<ответ> В качест
В текстовом файле c именем FN1 дана домашняя работа третьеклассника в формате:...

Как узнать какого размера операнд
Здравствуйте, подскажите пожалуйста как определить уже в программе какого размера x - байт, слово...

Имя типа или пространства имен отсутствует в пространстве имен
Подскажите решение проблемы. Целиком код:

Использование имен предопределенных объектов в качестве имен переменных
Есть код: #include &lt;iostream&gt; using namespace std; void func() { int cout; cout &lt;&lt;cout...

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

3
Ethereal
7696 / 2255 / 308
Регистрация: 17.02.2013
Сообщений: 3,330
01.06.2019, 04:33 2
Лучший ответ Сообщение было отмечено vladimashev как решение

Решение

x и y это не имена переменных, а имена адресов по которым лежат переменные.
Это ассемблер, а не ЯВУ.
Поэтому x-y это разность адресов.

Переход от адреса к значению лежащему по этому адресу называется разыменованием.
Вот если на Паскале написать :
X := X + 2 ;
тогда левее оператора присваивания X будет означать адрес по которому положить. А правее уже не адрес, а значение, того, что по этому адресу лежит. Т.е. в подобного рода ЯВУ в правой части оператора присваивания автоматически производится разыменование. Это рождает привычку, что якобы X означает значение переменной X. А в ассемблере ничего автоматически не делается, приходится от этого отвыкать и привыкать обратно к тому, что имя дается адресу (например переменной), а не значению лежащему по адресу.

Точнее сия истина увы зависит от ассемблера. В FASM
mov eax, x ;положить в eax адрес
mov eax,[x] ;положить в eax значение по адресу
mov eax,x-y ;положить в eax разность адресов
Тут все логично - где разыменования нет, там его нет, а [] означает разыменование.
А в MASM противоречивый синтаксис, про это уже 100 раз сказано и без меня
mov eax, offset x ;положить в eax адрес
mov eax,x ;положить в eax значение по адресу
mov eax,[x] ;то-же что выше, [] игнорируются
mov eax,x-y ;положить в eax разность адресов
Тут надо привыкнуть к тому в каком случае что означает что и флегматично смотреть на то, что оно криво.

Добавлено через 4 минуты
Цитата Сообщение от vladimashev Посмотреть сообщение
mov eax, x - y
Ну и на закуску, если ты имел ввиду положить в eax разность двух переменных, то нет такой команды у процессора - вычесть из двух мест и положить в третье. У команды есть источник и есть приемник. Нету третьего места. Так-что по MASM-овски будет
mov eax,x
sub eax,y
А когда ты пишешь mov eax, x - y ассемблер считает разницу адресов x и у на этапе компиляции. И тут все нормально. Рождается команда занесения в eax непосредственного значения. Но разность-то двух переменных должна считаться машинной командой на этапе исполнения. А вот нету такой команды - вычесть две переменные из памяти и результат в eax.
2
Mikl___
Автор FAQ
13893 / 6528 / 658
Регистрация: 11.11.2010
Сообщений: 11,759
01.06.2019, 06:31 3
по MASM-овски будет
Assembler
1
2
mov eax,offset x
sub eax,offset y
но это для 32-разрядного программирования, для х64
Assembler
1
2
3
lea rax,x
lea rcx,y
sub rax,rcx
1
Ethereal
7696 / 2255 / 308
Регистрация: 17.02.2013
Сообщений: 3,330
05.06.2019, 08:23 4
Код
Microsoft (R) Macro Assembler Version 6.14.8444		    06/05/19 09:11:08
a.asm							     Page 1 - 1


				.386
				.model flat, stdcall
 00000000			.code
 00000000			start:
 00000000  B8 00000001		mov eax,x-y
 00000005 00			y db 0
 00000006 00			x db 0
				end start
Microsoft (R) Macro Assembler Version 6.14.8444		    06/05/19 09:11:08
a.asm							     Symbols 2 - 1
Добавлено через 5 минут
Цитата Сообщение от Mikl___ Посмотреть сообщение
по MASM-овски будет
Ах, ну да. Не сразу понял, что эта фраза прямая цитата из меня. Автор топика понял команду mov eax,x-y как положить в eax разность значений двух переменных. Я про это имел ввиду когда написал mov eax,x sub eax,y

Добавлено через 7 минут
Ну короче мы по мелочи не догнали сразу кто что имел ввиду. Я зачем-то листинг выложил поняв не так.
0
05.06.2019, 08:23
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2019, 08:23

Сколькими способами можно назвать ребенка, если ему дают не более трех имен, а общее число имен равно n
У англичан принято давать детям несколько имен.Сколькими способами можно назвать ребенка, если ему...

Найти пересечение, объединение, разность, симметрическую разность множеств
Задание: Написать программу, которая проделывается операции над множествами (пересечение,...

Имя типа или пространства имен "ProtectedData" отсутствует в пространстве имен System.Security.Cryptography
Такая проблема, пытаюсь собрать проект , но дает ошибки : по идее, они должны идти в комплекте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru