Kysymys:
Mitä tarkoittaa movabit kaasu / x86 AT&T -syntaksissa?
perror
2013-08-12 21:00:51 UTC
view on stackexchange narkive permalink

Löysin juuri oudon käskyn kokoamalla ( gas ) ja purkamalla (with objdump ) amd64 -arkkitehtuuriin.

Alkuperäinen kokoonpanokoodi amd64 on:

  mov 0x89abcdef,% al  

Ja jälkeen gas käänsi sen (käytän seuraavaa komentoriviä: gcc -m64 -march = i686 -c -o myobjectfile myassemblycode.s ), objdump antaa seuraava koodi:

  a0 df ce ab 89 00 00 movabs 0x89abcdef,% al  

Minun ongelmani on, että en löydä yhtään movab eikä movab Intelin asennusoppaassa (ei edes mova -ohjeita).

Joten haaveilen? Mitä tämä ohje tarkoittaa? Oletan, että se on oivalluksia GNU binutilsilta, mutta en ole siitä varma.

PS: Tarkistin tarkasti tämän ohjeen oikeinkirjoituksen, joten se EI ole movaps koodi> ohjeet varmasti.

Ensimmäiset 5 tavua on mielestäni "a0 ef cd ab 89", ei "a0 df ce ab 89".
http://stackoverflow.com/questions/19415184/load-from-a-64-bit-address-into-other-register-than-rax
Katso myös [Milloin MOVABS-käsky otettiin käyttöön?] (Http://reverseengineering.stackexchange.com/q/6540/5853)
Neljä vastused:
0xC0000022L
2013-08-12 22:32:13 UTC
view on stackexchange narkive permalink

Tässä on virallinen gas -dokumentaatio, jossa mainitaan asiaankuuluva osa:

AT&T-syntaksissa muistin operandien koko määritetään käskyn muistin viimeinen merkki. Muistin jälkiliitteet b , w , l ja q määrittävät tavun (8-bittinen), sanan (16- bitti), pitkä (32-bittinen) ja nelisanainen (64-bittinen) muistiviitteet. Intelin syntaksissa tämä saavutetaan etuliittämällä muistin operandit (ei käskyjen muistisanoja) tavu ptr , sana ptr , sanasana ptr ja qword ptr . Siten Intel mov al, tavu ptr foo on movb foo,% al AT&T-syntaksissa.

64-bittisessä koodissa movabs : lla voidaan koodata mov -komento 64-bittisellä siirtymällä tai välittömällä operandilla.

Lue erityisesti viimeinen virke.

Huomautus: Löydetty Google-operaattorin inurl kautta ja etsii koodia movabs inurl: sourceware.org/binutils/ .

Katsoin kaasukäsikirjaa, mutta en löytänyt oikeaa osaa. Kiitos paljon 0xC0000022L! :-)
Kuinka voit siirtää 32-bittisen luvun al: iin?
@LưuVĩnhPhúc: No, voit vain tappioilla, mutta tällä ei ole mitään tekemistä vastaukseni tai kysymyksen kanssa, joten kysy se paremmin uudeksi kysymykseksi.
Mikä mielenkiintoista on, että gdb antaa minulle `` 48 b8 `tavua` `movabs rax, ` `jopa` `purkaminen-maku = intel ''.
ekse
2013-08-12 22:35:35 UTC
view on stackexchange narkive permalink

movabsia käytetään absoluuttiseen tiedonsiirtoon, joko mielivaltaisen 64-bittisen vakion lataamiseen rekisteriin tai tietojen lataamiseen rekisteriin 64-bittisestä osoitteesta.

Lähde: http : //www.ucw.cz/~hubicka/papers/amd64/node1.html

Igor Skochinsky
2013-08-13 02:59:46 UTC
view on stackexchange narkive permalink

Jos huomaat usein salaavan AT&T-syntaksin x86 / x64 assembleria, Solaris-käyttöoppaat voivat olla hyödyllisiä: x86 Assembly Language Reference Manual.

hyvä ladattava viite kiitos igorsk linkistä
kyoungson jhang
2016-10-14 05:33:39 UTC
view on stackexchange narkive permalink

Huomasin, että GAS kääntää

  movq $ 0x80000000,% rax  

kieleksi

  movabs 0x80000000,% rax  

Mutta pienempiä kuin 0x80000000-liikkeen arvoja ei käännetä movabs -iksi. Toisin sanoen movq $ 0x7fffffff, $ rbx EI käännetä osioon movabs $ 0x7fffffff,% rbx . Voit tarkistaa disas disassemble -komennolla GDB: ssä.

Ehkä syy on se, että $ 0x80000000 on yli allekirjoitetun positiivisen 32-bittisen lukualueen ja tarvitsee käännetään 64-bittiseksi kokonaisluvuksi. Tästä syystä GAS muuntaa tällaisen suuremman numeron 64-bittiseksi kokonaisluvuksi ja käyttää siksi movabsq -komentoa movq -käskyn sijaan, jonka lähde on rajoitettu 32-bittiseen vakioon.

tämä on väärin `movq $ 0x80000000,% rax` siirtää välittömän 0x80000000 rax: iin, kun taas` movabs 0x80000000,% rax` lataa nelisanan osoitteessa 0x80000000 rax: iin


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...