2016-10-29 14 views
-5

私はただアセンブリに入っていて、一度に1バイト以上でxorという方法があるのだろうと思っていました。私は1つのコマンドでこれを行うしたいと思います:1バイト以上使用することができます

IDEAL 
    MODEL small 
    STACK 100h 
    DATASEG 

    msg db "I LIKE ASSEMBLY$" 

    CODESEG 
    start: 
     mov ax,@data 
     mov ds, ax 
     xor [msg],01001010b 

    exit: 
     mov ax, 4c00h 
     int 21h 
    END start 

しかし、コードのこの作品でそれだけでxor S「I」

+1

8086では、一度に2バイトずつxorできますが、その文字列をxorに変換するには、文字とxorをループする必要があります。 –

+1

https://hjlebbink.github.io/x86doc/html/PXOR.html –

+0

ここで具体的に説明しましょう。これを実行しているプロセッサは何ですか? (x86はあいまいですが)与えられたコードは16ビットコードとMS-DOSをサポートする環境で実行されることを想定していますが、上の「IDEAL」は、私が64ビット命令をサポートしていることを思い出さないTASMを使用していることを示唆しています。 –

答えて

0

はい、2, 4, and 8 byte opcodesがあります(8バイトのオペコードがx86-64のを必要とし、あなたはこのパターンでそれを使用するためにレジスタにあなたの定数を必要とするようにのみ、符号拡張32ビット即値ことができます。)

xor dword [msg], 01001010010010100100101001001010b 
+0

のasmの大部分のフレーバでは、operand-sizeは即時に行われません(または、imm8に収まる場合でも32ビットの即時使用を強制する可能性があります)。 'xor qword [msg]、-1は8バイトのすべてのビットを反転します。 (64ビットのオペランドサイズのフォームがありますが、その即値は32ビットまたは8ビットの符号拡張だけです。ほとんどのinsnのように:['xor r/m64、imm32'または' xor r/m64、 imm8'](http://www.felixcloutier.com/x86/XOR.html) –

+0

@PeterCordes:サイン拡張は彼が望むものではありません。私は、サイズマーカーがどちらの側にあるのかをむしろ寛解させることに慣れてきたと思います。 – Joshua

+0

えええええええええええええええええええええええええええええええたものによって8つのコピーが表現できないので、OPの定数は64ビットレジスタにある必要があります。しかし、ビット31に一致する上位32ビットのものは何でもできます。とにかく、もっと重要なのは、 'xor [msg]、dword -1'はimm32の3バイトを無駄にします。それは悪い習慣であり、あなたが実際にそれを望んでいない場合、あなたはそれを決して書くべきではありません。 –

1

EMU8086は、一度に16ビットでの作業に限定されています。 XORには、あなたは何らかの種類のループを使用する必要がある全体の文字列。文字列の各文字は1バイトまたは8ビットで表されるため、一度に2文字ずつXORにすることができます。

start: 
    mov ax,@data 
    mov ds, ax 
    mov bx, offset msg 
    again: 
     cmp [bx], '$' 
     je EndOfString 
     cmp [bx+1], '$' 
     je LastChar 
     xor word ptr [bx], 0100101001001010b 
     add bx, 2 
     jmp again 
    LastChar: 
     xor [bx], 01001010b 
     inc bx 
    EndOfString: 

これらのソリューションの両方が去る:今一度に2つの文字を処理ソリューションが来る

start: 
    mov ax,@data 
    mov ds, ax 
    mov bx, offset msg 
    jmp TestEnd 
    again: 
     xor [bx], 01001010b 
     inc bx 
    TestEnd: 
     cmp [bx], '$' 
     jne again 

:一度に1つの文字を処理するとき、私は最初のソリューションを紹介します

終了$文字を指すBXレジスタ。

関連する問題