|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shuiyu 于 2017-7-6 22:50 编辑
小白刚学,不对的请各位大佬指正,谢谢
一、[bx]和内存单元的描述
(1)[bx]是什么呢?
和[0]有些类似,[0]表示内存单元,它的偏移地址是0。
[bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:
mov ax,[bx]
mov al,[bx]
(2)在debug中我们可以用:mov ax,[0] 这样的命令赋值。但是我们在编译器中就不能这样使用了。因为编译器不认识它。
比如我们要给AX赋值10000H这个内存的数值,在编译器中我们要这样用:
mov bx,10000H
mov ax,[bx]
大家都会发现多绕了一步,但是我们没办法,因为编译器不认识。
(3)[bx]具体解释:
mov ax,[bx]
功能:bx 中存放的数据作为一个偏移地址EA ,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中。
即: (ax)=(ds *16 +(bx));
mov [bx],ax
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。
即:(ds *16 +(bx)) = (ax)
二、loop、描述性符号“()”(其实就是取括号内的内容)、约定符号idata表示常量
(1)loop:英文单词“loop”有循环的含义,显然这个指令和循环有关。
(2)为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号 “() ”来表示一个寄存器或一个内存单元中的内容。
1.ax中的内容为0010H,我们可以这样来描述:(ax)=0010H;
2.2000:1000 处的内容为0010H,我们可以这样来描述:(21000H)=0010H;
3.对于mov ax,[2]的功能,我们可以这样来描述:(ax)=((ds)*16+2);
4.对于mov [2],ax 的功能,我们可以这样来描述:((ds)*16+2)=(ax);
5.对于 add ax,2 的功能,我们可以这样来描述:(ax)=(ax)+2;
6.对于add ax,bx的功能,我们可以这样来描述:(ax)=(ax)+(bx);
7.对于push ax的功能,我们可以这样来描述:
(sp) = (sp)-2
((ss)*16+(sp))=(ax)
8.对于pop ax 的功能,我们可以这样来描述:
(ax)=((ss)*16+(sp))
(sp)=(sp)+2
(3)我们在Debug 中写过类似的指令:mov ax,[0],表示将 ds:0 处的数据送入ax中。指令中,在“[…]”里用一个常量0表示内存单元的偏移地址。以后,我们用idata表示常量。
例如:
mov ax,[idata]就代表mov ax,[1]、mov ax,[2]、mov ax,[3]等。
mov bx,idata就代表mov bx,l、mov bx,2、mov bx,3等。
mov ds,idata就代表mov ds,1、mov ds,2等,它们都是非法指令。
问题5.1
(1)问题主要考我们的就是[bx]的应用。
(2)最后我们得出:
21000H=BE
21001H=00
21002H=BE
21003H=00
21004H=BE
21005H=BE
21006H=BE
21007H=20(最后这个空题目没有赋值,所以就看你的电脑原来是什么值,那就是什么值了)
附上我自己的答案:
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢 |
评分
-
查看全部评分
|