假设指令:MOV BX

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。

例3.4 假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?

解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)=2100H+0011H=2111H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2111H=12111H

所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。

例3.4 假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?

解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)=2100H+0011H=2111H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2111H=12111H

所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。

http://www.zznews.cn/hyzx/jkxx/5347227324.html
http://www.zznews.cn/hyzx/jkxx/5347234827.html
http://www.fengone.com/bj/jsqy/2014/0411/493967.html
http://www.zznews.cn/hyzx/jkxx/5346187258.html
http://www.yltvb.com/xwbk/redianxinwen/5346328135.html
http://www.yltvb.com/xwbk/redianxinwen/5346328135.html
http://www.lfxww.com/2014/shichangshangxun/2014/0411/787594.html
http://blog.sina.com.cn/s/blog_ecd6fa280101ihti.html
http://blog.sina.com.cn/s/blog_ecd6fa280101ihtg.html
http://blog.sina.com.cn/s/blog_ecd6fa280101ihtc.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1)主程序和子程序如下,注释已经加上: ``` buf1 equ 2200h buf2 equ 2250h buf3 equ 22a0h stack segment sp1 db 20 dup(0) stack ends code segment assume cs:code,ss:stack beg proc far start: ; 初始化堆栈 mov ax,0h mov ds,ax mov ax,stack mov ss,ax ; 写入数据 mov bx,buf1 mov al,0ah call fmov mov bx,buf2 mov al,0bh call fmov mov bx,buf3 mov al,55h call fmov ; 无限循环,程序不会退出 jmp start fmov proc near ; 入口参数:bx表示起始地址,al表示写入的值 mov cx,16 fmov_lop: mov [bx],al inc bx loop fmov_lop ret fmov endp code ends end beg ``` 可以将 `call` 换为 `jmp` 指令,但是这样做需要手动保存和恢复堆栈指针,增加了程序的复杂度。因此,使用 `call` 更为简单和稳定。子程序的入口参数通过寄存器传递,bx表示起始地址,al表示写入的值。 2)子程序如下: ``` swap proc near ; 入口参数:bx1表示第一个起始地址,bx2表示第二个起始地址 push ax push cx ; 交换数据 mov cx,16 swap_lop: mov al,[bx1] xchg al,[bx2] mov [bx1],al inc bx1 inc bx2 loop swap_lop pop cx pop ax ret swap endp ``` 子程序的入口参数通过寄存器传递,bx1表示第一个起始地址,bx2表示第二个起始地址。 3)如果将程序的前两句改为 `Mov ax,0220h` 和 `Mov ds,ax`,则程序中的 `buf1`、`buf2`、`buf3` 应该定义为: ``` buf1 equ 0000h buf2 equ 0050h buf3 equ 00a0h ``` 因为 `ds` 寄存器被设置为 0220h,意味着数据段的实际起始地址为 02200h,而 `buf1`、`buf2`、`buf3` 相对于数据段的偏移量分别是 0、50h 和 a0h。而在之前的程序中,假设 `ds` 寄存器的值为 0,因此 `buf1`、`buf2`、`buf3` 相对于数据段的偏移量就是它们的实际起始地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值