我对寻址模式有点困惑。
array1 DWORD 200 DUP(?)
如果我有这样的陈述:
mov EAX, [EBX + EDI + 10]
EBX是基础,EDI是索引,10是说向EDI再添加10个字节?那么,EDI将返回14字节长?然后返回地址并将其放入EAX?
类似地,
mov EAX, [EBX + EDI * 4]
这是说在数组中的任何索引处,返回4个字节长吗?因为数组对每个索引都有4个字节长,对吗?我想我不明白*4是做什么的!
另外,
mov ECX, 100 ; loop counter
mov ESI, 0
top1:
mov [array1 + ESI * 4], ECX
inc ESI
loop top1
这将把数字100放入数组,从索引0开始,4字节大。所以,index[0] = 100,index[1]= 101,index[2]= 102?
谢谢你
mov EAX, [EBX + EDI + 10]
将< code>EBX中的值与< code>EDI中的值相加,再加上10,然后将此结果用作地址,将32位值加载到< code>EAX中。
mov EAX, [EBX + EDI * 4]
获取 EBX
中的值,并将其添加到 EDI
中值的 4 倍,然后将结果用作地址,将 32 位值加载到 EAX
中。
最后一个将从100开始的递减数字序列存储到从array1
开始的内存位置中。ECX
每次执行循环
指令时都会递减,直到它达到0。ECX
的每个累进值存储的地址是array1
加上4次ESI
,每次迭代都会递增。
我使用英特尔®架构代码分析器(IACA)发现了一些(对我来说)意想不到的东西。 以下使用寻址的指令 不符合IACA规定的微型保险丝。但是,如果我这样使用
大多数汇编语言指令都需要处理操作数。 操作数地址提供存储要处理的数据的位置。 某些指令不需要操作数,而某些其他指令可能需要一个,两个或三个操作数。 当指令需要两个操作数时,第一个操作数通常是目标,它包含寄存器或存储单元中的数据,第二个操作数是源。 源包含要传递的数据(立即寻址)或数据的地址(寄存器或存储器)。 通常,源数据在操作后保持不变。 三种基本寻址方式是 - 寄存器寻址 立即寻址 内存寻址
周五晚上,绝影和往常一样回家。这是他和他们这些大学生唯一不同的地方:他家和大学在一个城市,每周五就可以回家。这样做的好处有两点:一、每周只有五天要用生活费;二、可以不用自己洗衣服,冬天的衣服,直接穿回家换就好了,夏天的,打包回家换。 这周过来,他和平时有点不一样,土匪见他提了两本书,一本《鲁迅杂文全集》,一本《PC汇编语言程序设计》。 土匪对这两本书没都没啥兴趣,他喜欢看武打小说,是“武打”小说,
4. 寻址方式 通过上一节的例子我们了解到,访问内存时在指令中可以用多种方式表示内存地址,比如可以用数组基地址、元素长度和下标三个量来表示,增加了寻址的灵活性。本节介绍x86常用的几种寻址方式(Addressing Mode)。内存寻址在指令中可以表示成如下的通用格式: ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER) 它所表示的地址可以这样
3.6 基址加变址寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的计算公式如右式所示。 在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。 例3.4 假设指令:MOVBX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,
他在找那本《PC汇编语言程序设计》,那书封面已经被撕掉,还好没被当废纸扔掉。他赶紧翻到寻址那章。 原来如此!寻址方式原来就是寻找数据的方法。比如要除法,被除数在哪里,除数在哪里,商放哪里,余数放哪里,要么在寄存器要么在内存。就这么简单个道理,不如就叫“数据寻找方法”那让人一看就明白,多直观。非要叫个大家都不熟悉的“寻址”。就算叫“寻址”,也完全可以在旁边加以解释,或者写上句:“XXXX寻址方式类似