汇编语言(三)存储器寻址方式的小疑问及Debug与MASM源程序的不同处理

        今天在做作业的时候遇到一个问题,老师说:“不允许 两操作数都为存储器寻址方式!”。即:  

      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]

等指令都应该是不合法的。

然而:

汇编语言(三)存储器寻址方式的小疑问及Debug与MASM源程序的不同处理_第1张图片

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源程序的不同处理_第2张图片

        可以在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中的情况:】

汇编语言(三)存储器寻址方式的小疑问及Debug与MASM源程序的不同处理_第3张图片

【MASM中的情况:

汇编语言(三)存储器寻址方式的小疑问及Debug与MASM源程序的不同处理_第4张图片

那么我们可以这样访问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]

汇编语言(三)存储器寻址方式的小疑问及Debug与MASM源程序的不同处理_第5张图片

证实:不允许 两操作数都为存储器寻址方式!

你可能感兴趣的:(Assembly)