В bx изначально 2. Инструкция lea кладёт адрес правого операнда в левый. Получается bx = 2 + 2*2 = 6.
bx = ebx+ebx*2 если ebx=2, то ebx+ebx*2=6 bх - это младшие 16 бит регистра ebx, поэтому по идее перед mov bx,2 должен стоять xor ebx,ebx чтобы обнулить старшую часть ebx - иначе там может быть какой-то мусор и результат м.б. не равен 6
е можно убрать(мысленно) чтоб не мешал, тогда будет понятно lea bx,[bx+bx*2] Какой нафиг адрес, bx*3 и все
emo > "Инструкция lea кладёт адрес правого операнда в левый" Инструкция lea вычисляет эффективный адрес заданный вторым операндом (источником) и сохраняет результат вычисления в первом операнде (приемнике). Наверное тебя смущает слово "адрес". Хотя формально назначение lea это действительно вычисление и загрузка адреса в соответствии с допустимым сспособами адресации, тем не менее ее часто используют просто для арифметических вычислений, в частности для быстрого умножения чисел (в твоем примере это умножение числа на 3)
Тоже, что и mov bx,[xx] ... Я до сих пор не понимаю этого дублирования, или в реальном режиме есть какие-то различия?
MCL > "адрес байта, который находится по адресу" во-первых,в народе про такое говорят - масло масляное ) во-вторых, вычисленный адрес м.б. инвалидным и никакого байта по этому адресу может и не быть bogrus > "Тоже, что и mov bx,[xx]..." ... Ты че - прикалываешься =) emo не слушай, ты нас умников - мы тут видать пивка все махнули с устатку в конце трудовой недели Получилось у тебя 2+2*2=6 и слава богу, если сомневаешься - проверь на калькуляторе А не то счаз в такие дебри залезем...
leo блин, переклинило ну что lea bx,[0xffff] и mov bx,0xffff тоже самое но кодируется по другому, короче lea c памятью не работает, хотя reg,mem стоит в opcodes.hlp
Короче так. Инструкция процессора LEA просто вычисляет выражения типа BaseReg+IndexReg*Scale+Disp, где BaseReg и IndexReg регистровые операнды, Scale=0,1,2,4,8 и Disp - числовая константа (8 или 16\32 бит). И по сути пофиг какие операнды мы подставляем в LEA - это может быть как вычисление адреса, так и просто сложения\умножения любых чисел. А название инструкции Load-Effective-Address и мнемоника описания опкода LEA r32,m просто связаны с тем, что допустимые выражения в операнде источнике соответствуют способам адресации памяти и на языке асма заключаются в квадратные скобки. Ec-но инструкция MOV reg,[mem] это совсем другое, т.к. LEA просто вычисляет адрес, заданный выражением mem, и сохраняет его в reg, а MOV загружает в reg данные из памяти, которые лежат по адресу mem. Разумеется если адрес mem инвалидный, то MOV выдаст исключение, а для LEA ес-но пофиг чего там получится в результате. Ну а с адресами в LEA мы имеем дело не на уровне процессора (которому все равно что мы вычисляем), а на уровне соглашений ассемблера. Наприммер, при buf dq 0 команда ассемблера lea eax,[buf+4] загрузит в eax адрес старшего дворда переменной buf (хотя для процессора это просто загрузка константы Disp32, которую асм любезно вычислит и подставит в машинный код за нас
>> "адрес байта, который находится по адресу" >во-первых,в народе про такое говорят - масло масляное ) Масло то масляное, но кашу маслом не испортишь Лично мне данное обьяснение понятней. То есть: говорю, как понимаю. >во-вторых, вычисленный адрес м.б. инвалидным и никакого >байта по этому адресу может и не быть Ну даже может и не быть, и что? Это никак не мешает нам узнать адрес.
MCL прав. Наверное просто путаницу вводит наличие скобок - в lea они могут и не ставиться (что lea edx, String, что lea edx, [String] будут работать одинаково(по крайней мере в masm32)).
Только нужно отметить, что команда lea, к скобкам в MASM'e отношения не имеет. Там со всеми командами так же будет. И cmp и даже mov, это ж MS.