汇编问题!解释指令!

来源:百度知道 编辑:UC知道 时间:2024/07/08 15:30:18
设当前数据段寄存器的内容为1B00H,在数据段的偏移地址2000H单元内,含有一个内容为0FF10H和8000H的指针,它们是一个16位变量的偏移地址和段地址,试写出把该变量装入AX的指令序列,并画图表示出来。
答:(1)
MOV AX, 1B00H
MOV DS,AX
MOV BX, 2000H
MOV DX,[BX]
MOV AX,[BX]+2
MOV DS,AX
MOV AX,DS:DX
答:(2)
MOV BX,[2000H]
MOV AX, [2000H+2]
MOV ES,AX
MOV AX,ES:[BX]
MOV BX,2000H
LES BX,[BX]
MOV AX,ES:[BX]
我写自己对第一条的见解。
MOV AX, 1B00H 把1B00H传送给AX
MOV DS,AX 把AX传送给DS,确定段地址
MOV BX, 2000H 把2000H传送给BX
MOV DX,[BX] 把BX所指向的地址的内容传送给DX,此时DX代表FF10H
MOV AX,[BX]+2 把[BX+2]所指向的地址的内容传送给AX
MOV DS,AX 把AX传送给DS,确定段地址,此时DS代表8000H
MOV AX,DS:DX 把以DS(8000H)为段地址,DX(FF10H)为偏移地址得到的物理地址传送给AX。(不明白处,最后的结果是个地址???)
第2个答案的个人理解!
MOV BX,[2000H] 把2000H这个地址的内容传送BX中
MOV AX, [2000H+2] 把2002H这个地址的内容传送BX中 ([BX+2])
MOV ES,AX 把AX(8000H)传送给ES
MOV AX,ES:[BX] (不理解,为什么是[BX],而不是BX。从这开始不理解!)
MOV BX,2000H 把2000H传送给BX (这里的BX为什么要从头开始呢?难道是为了下面的语句?下面也就是ES代表8000H?而BX代表FF10H。)

1。第一种实现方法的最后一条语句语法是错误的,应改为:
MOV BX,DX
MOV AX,DS:[BX]或MOV AX,[BX]
其余地方你的理解是正确的。
2。第二个答案其实又包括两种实现方法,你把它们合并在一起了。
MOV BX,[2000H]
MOV AX, [2000H+2]
MOV ES,AX
MOV AX,ES:[BX];这是一种实现方法

MOV BX,2000H
LES BX,[BX]
MOV AX,ES:[BX];这又是一种实现方法
因此你一共给出了三种方法的实现。

MOV AX,ES:[BX] (不理解,为什么是[BX],而不是BX。从这开始不理解!)
在汇编语言中没有 段寄存器名:寄存器名 这种格式,只有在内存操作数对应的寻址方式前才能加段超越前缀,这说明你对寻址方式的理解还存在一定的问题,多看看就好了。

就实现题目的要求来讲,实际是很简单的一个事情,用一条指令即可实现:

MOV AX,[2000H] ;指令执行后AX=0FF10H

依题意,DS已经是1B00H,不必再给DS赋值;直接把[2000H]中的一个字取出来装入AX寄存器不就完事了吗?题目并未要求把那个16位变量的段地址赋给哪个段寄存器,如果有要求,无非是把这个段地址赋给DS或ES,这就更好办了。

LDS AX,[2000H]
指令执行后,AX=0FF10H,DS=8000H

或是

LES AX,[2000H]
指令执行后,AX=0FF10H,ES=8000H

答案(1)繁琐,且最后一条指令错误;答案(2)简直就是故弄玄虚、捉迷藏,看得我直迷糊。

答案1的最后一句改为
MOV AX,DS:[DX]
第2个答案的理解其实是楼主对[]这个符号缺乏认识
比如dx的值是2000H 在地址2000H装的是100
那么mov ax,dx ax的值会是2000H
mov ax,[dx] ax