2016-10-17 3 views
1

Ok kompilieren kann, so versuche ich, einige Code in der Montage zu montieren nasm -f elf final.asm mit:Convert Anweisung in Assembler-Code LODs und stos so NASM

xor eax,eax 
push eax 
push dword(0x75792273) 
push dword(0x70742027) 
push dword(0x77777875) 
push dword(0x20237678) 
push dword(0x76727827) 
push dword(0x27797175) 
push dword(0x75711225) 
push dword(0x72747676) 
push dword(0x74231476) 
push dword(0x70707470) 
push dword(0x23247077) 
push dword(0x78707822) 
push dword(0x24711174) 
push dword(0x22707373) 
push dword(0x78717974) 
push dword(0x75771777) 
push dword(0x70777125) 
push dword(0x73731472) 
push dword(0x71277377) 
push dword(0x79251822) 
push dword(0x79707478) 
push dword(0x78742779) 
push dword(0x72727871) 
push dword(0x71251475) 
push dword(0x27247772) 
push dword(0x79757479) 
push dword(0x70227071) 
push dword(0x77737420) 
push dword(0x70251970) 
push dword(0x74747127) 
push dword(0x23277677) 
push dword(0x79712024) 
push esp 
pop esi 
mov edi,esi 
mov edx,edi 
cld 
mov ecx,0x80 
mov ebx,0x41 
xor eax,eax 
push eax 
lods byte[esi] 
xor eax,ebx 
stos byte[es:edi] 
loop 0xb7 
push esp 
pop esi 
int 0x3 

die in den folgenden Fehler führt:

final.asm:44: error: parser: instruction expected 
final.asm:46: error: parser: instruction expected 

Ich fand die Antwort auf diese Fehler unter: NASM: parser: instruction expected rep movs

Grundsätzlich besagt dies, dass die lods und stos Anweisungen sind nein t von NASM erkannt. Was bedeutet, dass ich sie in etwas konvertieren muss, das NASM erkennt, so dass ich das gleiche Ergebnis bekomme.

Meine Frage ist, was kann ich diese beiden Zeilen ändern, damit NASM es kompilieren kann, damit ich es schließlich debuggen kann.

+2

Wechsel einfach 'lodsb' und' stosb' (keine Operanden). – Jester

+0

Wenn ich das ausführen, bekomme ich: test.asm: 44: Fehler: ungültige Kombination von Opcode und Operanden test.asm: 46: Fehler: ungültige Kombination von Opcode und Operanden – ChrisMan

+0

lodsb byte [esi] stosbybyte [es: edi] – ChrisMan

Antwort

2

was lodsb tut, ist:

mov al,[esi] 
inc esi   ; (or dec, according to direction flag) 

Sie auch
lodsw, um Wörter zu laden (zu ax) oder
lodsd zu laden D-Worte (auf eax) nutzen könnten.
esi um 2 oder 4, dass Fälle speichert 2 oder 4 Byte

lädt man aus dem Gedächtnis, wies

mov [es:edi],al 
inc edi 

hier gilt das gleiche, stosw und stosd

und stosb tut erhöht werden Durch das SOURCE (ESI) -Register schreibt man in den Speicher, auf den das DESTINATION-Register (ES: EDI) zeigt.

Sie müssen nicht (und kann nicht) angeben, welche Register verwendet werden. Source immer E S I, und Ziel immer E D I


Bearbeiten auf Segmentregister: Die lods Anweisung verwendet werden kann, zusammen mit Segmentüberschreibung Präfix (d.h. ss lodsb). Die stos Anweisung ist fest auf es (fehlende Details in der ursprünglichen Antwort) Segment-Verwendung und kann nicht überschrieben werden.

Die movsb/movsw/movsd Anweisungen (size*(mov [es:edi],[ds:esi] inc esi inc edi)) können auch auf der Quellseite überschrieben werden, dh. es movsb holt Bytes von es:esi anstelle von ds:esi, aber das Zielsegmentregister ist auf es festgelegt.

+0

@ Ped7g natürlich, Register verwendet ist 'al' ... nicht' ah'! Danke für die Korrektur – Tommylee2k

2

Intel's LODS documentation schlägt vor, dass Sie Operanden als Dokumentation verwenden und eine Operandengröße (und Segmentüberschreibung) als Alternative zu einem Operandengrößensuffix angeben können, wie Sie es versuchen.

This explicit-operands form is provided to allow documentation; however, note that the documentation provided by this form can be misleading. That is, the source operand symbol must specify the correct type (size) of the operand (byte, word, or doubleword), but it does not have to specify the correct location. The location is always specified by the DS:(E)SI registers, which must be loaded correctly before the load string instruction is executed.

Vermutlich die Designer von NASM Syntax entschieden, dass lods byte [r15] so dass eine schlechte Idee zu montieren war, und die Form eines Operanden disallowing war ganz einfacher als nur ein Bündel von Code schreiben zu überprüfen, ob der angegebene Operand ist, was es ist soll sein.

Da NASM einen Präfix Syntax für Segment/Operand/Adressenüberschreibungen hat, fs lodsb können Sie schreiben, was sonst einen Operanden benötigen würde ein Segment überschreiben zu befestigen (wie lodsb fs:[rsi] in MASM Syntax.)

es auf diese Weise tun macht die String-Anweisungen für den Assembler unspeziell; Sie sind nur ein weiterer Eintrag in einer Tabelle, die Mnemotechniken auf Opcodes abbildet. Wenn Intels eigene Syntax mnemonische Präfixe für Maschinencode-Präfix-Bytes enthielt, haben sie möglicherweise die gleiche Design-Wahl getroffen.

Fun Tatsache: STOS 's Segment kann nicht überschrieben werden (von ES). Vielleicht wollte Intel mehr Transistoren mit der ursprünglichen 8086-Implementierung von MOVS teilen, wobei eine Segmentüberschreibung nur die [DS:SI] Quelle betrifft, nicht die [ES:DI] Destination.


andere Assemblern:

GNU .intel_syntax unterstützt Segment Präfix Syntax, aber nicht der NASM o16/o32/oder o64a16/a32/a64 Operanden und Adressen-size Spezifizierer.

# assembled with as --32 disassembled with ndisasm -b 32 
.intel_syntax noprefix 

    mov al, byte ptr fs:[esi] 
        00000038 648A06   mov al,[fs:esi] 

    gs lodsb 
        0000003B 65AC    gs lodsb 
    lods dword ptr ss:[ecx] 
    # Warning: `dword ptr ss:[ecx]' is not valid here (expected `[esi]') 
        0000003D 36AD    ss lodsd 
    ss lodsd [si] 
        0000003F 3667AD   ss a16 lodsd 
    lods eax, dword ptr ss:[esi] 
        00000042 36AD    ss lodsd 

#lods al  # Error: operand type mismatch for `lods' 
#fs es lodsd # Error: same type of prefix used twice 
#a16 lodsb # Error: no such instruction: `a16 lodsb' 

Ich sehe keine Möglichkeit, eine Adresse-size Überschreibung zu schreiben, ohne einen expliziten Operanden für String-Anweisungen in GNU-Syntax (AT & T oder Intel).

objdump -Mintel Ausgang des gleichen:

4: 64 8a 06    mov al,BYTE PTR fs:[esi] 
    7: 65 ac     lods al,BYTE PTR gs:[esi] 
    9: 36 ad     lods eax,DWORD PTR ss:[esi] 
    b: 36 67 ad    lods eax,DWORD PTR ss:[si] 
    e: 36 ad     lods eax,DWORD PTR ss:[esi] 
+0

Unglaublich detailliert. Danke, das war sehr informativ! – ChrisMan