今天在做作业的时候遇到一个问题,老师说:“不允许 两操作数都为存储器寻址方式!”。即:
MOV [BX],[1000H]
MOV [DI],[BP]
MOV [3000H],[2000H]
MOV [BX+DI+300H],[200H]
MOV [BX+109H],[SI]
MOV [DI+BX],[BX][SI]
MOV [BP].500[SI],[60H]
等指令都应该是不合法的。
然而:
7条指令中只有5条被认为错误的。
MOV [DI],[BP] ;Improper operand type
MOV [3000H],[2000H] ;Immediate mode illegal
MOV [BX+109H],[SI] ;Improper operand type
MOV [DI+BX],[BX][SI] ;Improper operand type
MOV [BP].500[SI],[60H] ;Operand must have size
;以下两条在Debug中查看(将错误指令全部注释后 编译masm 链接link 调试debug)
MOV [BX],[1000H]
MOV [BX+DI+300H],[200H]
可以在debug中看到,我们在MASM里写的 MOV [BX+DI+300H],[200H] 被debug理解为 MOV [BX+DI+300H],200H 并默认指定为字型操作。MOV [BX],[1000H]被理解为 MOV [BX],1000H 也默认指定为字型操作。故并没有提示错误。
而在debug下使用e命令或a命令写入的 MOV [BX+DI+300H],[200H] 则会保持为真正的 MOV [BX+DI+300H],[200H]。
【再次实验】
【Debug中编程实现:】
mov ax,2000
mov ds,ax
mov al,[0]
mov bl,[1]
mov cl,[2]
mov dl,[3]
【汇编程序实现:】
assumecs:code
codesegment
start: mov ax,2000h
movds,ax
mov al,[0]
movbl,[1]
mov cl,[2]
mov dl,[3]
mov ax,4c00h
int 21h
code ends
end start
【Debug中的情况:】
【MASM中的情况:】
那么我们可以这样访问2000:0单元:
mov ax,2000h
mov ds,ax
mov bx,0
mov al,ds:[bx]
【三次实验】
mov [si],ds:[2000h]
mov [di],ds:[1000h]
mov [bx],ds:[989]
mov [bp],ds:[756]
mov ds:[124h],ds:[564]
mov [bx][di][2000],[si].300[bx]
MOV [BX],ds:[1000H]
MOV [DI],[BP]
MOV ds:[3000H],ds:[2000H]
MOV [BX+DI+300H],ds:[200H]
MOV [BX+109H],[SI]
MOV [DI+BX],[BX][SI]
MOV [BP].500[SI],ds:[60H]
证实:不允许 两操作数都为存储器寻址方式!