可以xor用于超过1个字节

时间:2016-10-29 21:39:00

标签: assembly emu8086

我刚刚进入汇编,并且想知道有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是'我'

2 个答案:

答案 0 :(得分:1)

EMU8086仅限一次使用16位。要XOR整个字符串,您需要使用某种循环。由于字符串中的每个字符仅由1个字节或8位表示,因此一次可以XOR个2个字符!

我会在一次处理1个字符时首先显示解决方案:

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

现在有一个解决方案,一次处理2个字符:

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:

这两种解决方案都使BX寄存器指向终止的$字符。

答案 1 :(得分:0)

是的,有2, 4, and 8 byte opcodes(8字节操作码需要x86-64,并且只允许符号扩展的32位立即数,因此您需要在寄存器中使用常量来使用此模式。)

xor dword [msg], 01001010010010100100101001001010b