汇编网首页登录博客注册
sissim的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
友情链接

[2010-03-12 20:36] 检测点16.2 关于assume的进一步认识

程序如下:
        assume  cs:code,es:data
data    segment
a       dw      1,2,3,4,5,6,7,8
b       dd      0
data    ends
code    segment
start:  mov     ax,data
        mov     es,ax
        mov     si,0
        mov     cx,8
s:      mov     ax,a[si]
        add     word ptr b,ax
        adc     word ptr b[2],0
        add     si,2
        loop    s

        mov     ax,4c00h
        int     21h
code    ends
        end     start

a[si],默认寻址的寄存器是ds,那么段地址应当到ds中去找。但是assume又把es和data段对应起来,那么应当把data的值送到es中。这样一来就产生了矛盾。
编译成exe文件,在debug中试验了一下,发现反汇编之后,mov     ax,a[si]被写成了
140E:000B 36            ES:
140E:000C 8B840000      MOV     AX,[SI+0000]

再次修改程序:assume  cs:code,ss:data
编译连接之后在debug中看到
140E:000B 36            SS:
140E:000C 8B840000      MOV     AX,[SI+0000]

从网上搜来的:
assume是指明变量与段寄存器的联系,比如assume ds:data,它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址。

原来是这样的:数据标号a是在data段中的,a[si]寻址时,段地址就在与data段联系的段寄存器中。而不是像之前想当然认为的,a[si]的寻址,就是隐含寻址ds。
评论次数(0)  |  浏览次数(1150)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码