做网站公证需要费用是多少,网址导航网址大全彩票网站大全,成都装修公司投诉平台,人工智能的关键词本节咱们介绍下intel汇编语法和att汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异#xff0c;个人觉得区别还是很大的#xff0c;下面单独说说。
在Intel语法中#xff0c;立即数就是普通的数字#xff0c;如果让立即数成为内存地址#xff0c;需要…本节咱们介绍下intel汇编语法和att汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异个人觉得区别还是很大的下面单独说说。
在Intel语法中立即数就是普通的数字如果让立即数成为内存地址需要将它用中括号括起来“[立即数]”这样才表示以“立即数”为地址的内存。
而ATT认为内存地址既然是数字那数字也应该被当作内存地址所以数字被优先认为是内存地址也就是说操作数若为数字则统统按以该数字为地址的内存来访问。这样立即数的地位比较次要了如果想表示成单纯的立即数需要额外在前面加个前缀$。
无论是哪种汇编语言风格都要有访问内存的能力这就是内存寻址。
咱们之前学习了Intel汇编语法中的很多寻址方式就内存寻址来说有直接寻址基址寻址变址寻址基址变址寻址。也可能是习惯了的原因我个人觉得intel语法真的很直白容易理解尤其是在和ATT的内存寻址相比较之后……
而在ATT中的内存寻址还是挺独特的它的内存寻址有固定的格式
segreg(段基址):base_address(offset_address,index,size)
该格式对应的表达式为
segreg(段基址):base_address offset_address index*size。
此表达式的格式和intel 32位内存寻址中的基址变址寻址类似intel的格式
segreg:[baseindex*sizeoffset]
不过与intel不同的是ATT地址表达式的值是内存地址直接被当做是内存来读写而不是普通数字。
看上去格式有些怪异但其实这是一种“通用”格式格式中短短的几个成员囊括了它所有内存寻址的方式任意一种内存寻址方式其格式都是这个通用格式的子集都是格式中各种成员的组合。下面介绍下这些成员项。
base_address是基地址可以为整数变量名可正可负。
offset_address是偏移地址index是索引值这两个必须是那8个通用寄存器之一。
size是个长度只能是1、2、4、8intel语法中也是只能乘以这4个数。
下面看看内存寻址中有哪些方式注意这些方式都是上面通用格式的一部分。
直接寻址此寻址中只有base_address项即后面括号中的东东全不要base_address便为内存啦比如movl $255,0xc00008F0或者用变量名mov $6var。
寄存器间接寻址此寻址中只有offset_address项即格式为(offset_address)要记得offset_address只能是通用寄存器。寄存器中是地址不要忘记格式中的圆括号。如mov (%eax), %ebx。
寄存器相对寻址此寻址中有offset_address项和base_address项即格式为base_address(offset_address)。这样得出的内存地址是基址偏移地址之和。
各部分还是要按照格式填写如movb -4(%ebx),%al功能是将地址(ebx-4)所指向的内存复制1字节到寄存器al。
变址寻址此类寻址称为变址的原因是含有通用格式中的变量Index。因为index是size的倍数所以有index的地方就有size。既然是变址只要有index和size就成了base_address和offset_address可有可无注意格式中没有的部分也要保留逗号来占位。一共有4种变址寻址组合下面各举个例子。
无base_address无offset_address:
movl %eax,(,%esi,2)
功能是将eax的值写入esi*2所指向的内存。
无base_address有offset_address:
movl %eax,(%ebx, %esi,2)
功能是将eax的值写入ebxesi*2所指向的内存。
有base_address无offset_address:
movl %eax,base_value(,%esi,2)
功能是将eax的值写入base_valueesi*2所指向的内存。
有base_address有offset_address:
movl %eax,base_value(%ebx,%esi,2)
功能是将eax的值写入base_valueebx esi*2所指向的内存。
好啦ATT就简单介绍到这咱们重点是内联汇编。