codecamp

Assembly 更高级的间接寻址

不要惊讶,间接寻址经常与数组一起使用。最普遍的间接内存引用格式为:


[ base reg(基址寄存器) + factor(系数) *index reg(变址寄存器) +constant(常量) ]


其中:


基址寄存器 可以是EAX,EBX,ECX,EDX,EBP,ESP,ESI或EDI寄存器。


系数 可以是1,2,4或8。(如果是1,系数是可以省略的。)


变址寄存器 可以是EAX,EBX,ECX,EDX,EBP,ESI或EDI寄存器。(注意ESP并不可以。)

常量 为一个32位的常量。这个常量可以是一个变量(或变量表达式)。


例子:

这有一个使用数组并将它传递给函数的例子。它使用array1c.c程序(下面列出的)作为驱动程序,而不是driver.c程序。


实例1

实例2

实例3

实例4


再看一下LEA指令

LEA指令不仅仅可以用来计算地址,也可以用作其它目的。一个相当普遍的目的是快速计算。考虑下面的代码:

lea     ebx, [4*eax + eax]

这条代码有效地将5 £ EAX的值储存到EBX中。相比于使用MUL指令,使用LEA既简单又快捷。但是,你必须认识到在方括号里的表达式必须是一个合法的间接地址。因此,例如,这个指令就不可以用来快速乘6。

Assembly 数组详解
Assembly 多维数组
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }