-5

我刚开始组装,想知道是否有任何方法可以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“我”

4

2 回答 2

2

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

在一次处理 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 寄存器指向终止 $ 字符。

于 2016-11-03T16:45:36.797 回答
0

是的,有2、4 和 8 字节操作码(8 字节操作码需要 x86-64,并且只允许符号扩展的 32 位立即数,因此您需要在寄存器中使用常量才能将其与此模式一起使用。)

xor dword [msg], 01001010010010100100101001001010b
于 2016-10-29T21:47:19.860 回答