Assembly 重复CMPSB问题
我尝试使用rep cmpsb,如下所示:Assembly 重复CMPSB问题,assembly,masm,x86-16,disassembly,tasm,Assembly,Masm,X86 16,Disassembly,Tasm,我尝试使用rep cmpsb,如下所示: DSEG SEGMENT PARA PUBLIC 'DATA' SOURCE DB 'ASDF' TARGET DB 'ASDF' SIZE EQU ($-TARGET) DSEG ENDS SSEG SEGMENT PARA STACK 'STACK' SSEG ENDS CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,DS:DSEG,SS
DSEG SEGMENT PARA PUBLIC 'DATA'
SOURCE DB 'ASDF'
TARGET DB 'ASDF'
SIZE EQU ($-TARGET)
DSEG ENDS
SSEG SEGMENT PARA STACK 'STACK'
SSEG ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:NOTHING
MAIN:
MOV AX,DSEG
MOV DS,AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET
CLD
MOV CX,SIZE
REPE CMPSB
MOV AH,4CH
INT 21H
CSEG ENDS
END MAIN
我用的是emu8086。
尝试了rep和repe,但什么也没发生。
rep实际上应该重复,直到cx>0,两个字符串是否相等,但不会发生,并且只运行一次(程序终止后,cx为3)
我还尝试了两个相等字符串的repe,但都没有结果
当在这两种模式下运行时,零标志永远不会改变,我认为应该改变它以正确地重复工作
因此,只有repne在cx=0之前工作,并且不会给出正确的结果
那我该怎么办呢
---------解决---------------
初始化ES后工作:
DSEG SEGMENT PARA PUBLIC 'DATA'
SOURCE DB 'ASDF'
TARGET DB 'ASDF'
SIZE EQU ($-TARGET)
DSEG ENDS
SSEG SEGMENT PARA STACK 'STACK'
SSEG ENDS
ESEG SEGMENT PARA PUBLIC 'EXTRA'
ESEG ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:ESEG
MAIN:
MOV AX,DSEG
MOV DS,AX
MOV ES, AX
MOV SI,OFFSET SOURCE
MOV DI,OFFSET TARGET
CLD
MOV CX,SIZE
REPE CMPSB
MOV AH,4CH
INT 21H
CSEG ENDS
END MAIN
尝试初始化
ES
寄存器,因为CMPS
将DS:SI
与ES:DI
进行比较。在MOV-DS,AX
之后添加MOV-ES,AX
。REP
或REPE
的使用取决于汇编程序。您需要检查qemu(或您正在使用的汇编程序)的确切文档。这里有更多信息(可能是副本)。@Jester非常感谢!现在可以了!:)