小白的汇编之路(四)----assume

前言

之前在纠结有关assume的问题

assume cs:codesg
...
#assume是否有将codesg段的地址传给cs寄存器
#如果有,是怎么做到的
#如果没有,那cs的值怎么办

无奈只能上网求助,在浏览了一些博客之后终于有了一些发现
本文仅是记录,对于assume的作用,有一部分是出自自身的猜测,所以可能会与事实不符;若有不符,请您不吝赐教,您的指点就是我的荣幸!

assume

assume cs:codesg
#assume并不会将codesg的段地址传给cs寄存器,assume属于伪指令,并不会被编译成机器指令。
#它起到协助编译器的作用,它是将codesg与cs寄存器关联起来。
#而有关cs寄存器的值仍需要我们在程序中编写代码进行赋值

以下的代码参考自:这位博主的博客
目的是:将数据区BUF1的10个数,传入到BUF2中,并计算其累加和

data segment 
    buf1 dw 0h,1h,2h,3h,4h,5h,6h,7h,8h,9h 
    buf2 dw 10 dup(0) 
data ends
 
assume cs:code,ds:data 
code segment 
start: mov ax,data 
       mov ds,ax 
       
       mov ax,0
       mov bx,0 
       mov cx,10   
       
     s:add ax,buf1[bx]
       inc bx
       loop s
       
       mov buf2,ax
            
       mov ax,4c00h
       int 21h 
code ends 

————————————————
版权声明:本文为CSDN博主「qq_38040674」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38040674/article/details/80182691

在上述的代码中,即便assume cs:codesg,我们也需要编写代码对cs寄存器进行赋值。
而且注意:

add ax,buf1[bx]
#显而易见,这是将BUF1数据区的10个值逐一拿到并累加,那么他是怎么拿到BUF1所在段的段地址的?
#这就要看其上的
==============华丽的分割线===============
...

assume cs:code,ds:data 
code segment 
start: mov ax,data 
       mov ds,ax 
   
...
#我们将data段的地址与ds寄存器关联起来,而当我们需要使用BUF1时。其所在的段的段地址已经与ds寄存器关联起来了
#从而取到了BUF1数据区的数据       
发布了10 篇原创文章 · 获赞 3 · 访问量 320

猜你喜欢

转载自blog.csdn.net/weixin_41043607/article/details/104761251