为什么`lea esi,dword [edx + ecx * 4]`在使用NASM组装时会产生错误?

时间:2016-08-05 08:10:04

标签: assembly x86 nasm

为什么lea esi, dword [edx + ecx * 4]在使用NASM进行汇编时会产生错误?

我收到错误:

  

insertion_sort.asm:19:错误:操作数大小不匹配

但是,lea的目的只是加载dword [edx + ecx * 4]的地址,所以即使这样引用的是DWORD值也无关紧要?

另一方面,

mov eax, dword [edi] 

按预期完美地运作。在这里,我声明[edi]引用了DWORD值。

2 个答案:

答案 0 :(得分:3)

lea的情况下,大小说明符不相关。您没有从内存中加载任何内容 - 您只是计算一个地址(甚至不需要将您计划用作地址的内容 - 您可以使用lea进行通用算术)。 lea esi, byte [edx]lea esi, dword [edx]之间没有区别,因此根本没有大小说明符。

mov示例中,它实际上是多余的,因为可以从目标操作数推断出大小。但在mov的情况下,它在某些情况下实际上是相关的(例如mov byte [edi], 1),而在lea的情况下则不是lea

请注意,可以<script type='text/javascript'> jQuery(document).ready(function($){ var geocoder; var map; var markersArray = []; var infos = []; geocoder = new google.maps.Geocoder(); var myOptions = { zoom: 9, mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); var bounds = new google.maps.LatLngBounds(); var encodedString; var stringArray = []; encodedString = document.getElementById("encodedString").value; stringArray = encodedString.split("****"); var x; for (x = 0; x < stringArray.length; x = x + 1) { var addressDetails = []; var marker; addressDetails = stringArray[x].split("&&&"); var lat = new google.maps.LatLng(addressDetails[1], addressDetails[2]); marker = new google.maps.Marker({ map: map, position: lat, //Content is what will show up in the info window content: addressDetails[0] }); markersArray.push(marker); google.maps.event.addListener( marker, 'click', function () { closeInfos(); var info = new google.maps.InfoWindow({content: this.content}); //On click the map will load the info window info.open(map,this); infos[0]=info; }); //Extends the boundaries of the map to include this new location bounds.extend(lat); } //Takes all the lat, longs in the bounds variable and autosizes the map map.fitBounds(bounds); //Manages the info windows function closeInfos(){ if(infos.length > 0){ infos[0].set("marker",null); infos[0].close(); infos.length = 0; } } }); </script> </head> <body> <div id='input'> <?php $encodedString = ""; $x = 0; $result = mysql_query("SELECT * FROM `table-name`"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { if ( $x == 0 ) { $separator = ""; } else { $separator = "****"; } $encodedString = $encodedString.$separator. "<p class='content'><b>Lat:</b> ".$row[1]. "<br><b>Long:</b> ".$row[2]. "<br><b>Name: </b>".$row[3]. "<br><b>Address: </b>".$row[4]. "</p>&&&".$row[1]."&&&".$row[2]; $x = $x + 1; } ?> <input type="hidden" id="encodedString" name="encodedString" value="<?php echo $encodedString; ?>" /> </div> <div id="map_canvas"></div> 计算一个16位地址并将其零扩展到一个32位目标寄存器(或计算一个32位地址并将其截断为一个16位目标寄存器)。但地址大小是根据英特尔手册确定的&#34;代码段的属性&#34; ,而不是您在指令中指定的内容。

答案 1 :(得分:0)

稍微调整一下后,我相信dword前缀是nasm的绊倒。把它留下来,让诺姆很高兴。