代码改变世界

编程:将a段和b段中的数据依次相加,保存在c段

2012-06-02 21:06  youxin  阅读(2107)  评论(0编辑  收藏  举报

    编程:编写code段中的代码,将a段和b段中的数据依次相加,保存在c段。

assume cs:code
a segment
   db 1,2,3,4,5,6,7,8
a ends
b segment
   db 1,2,3,4,5,6,7,8
b ends
c segment
   db 0,0,0,0,0,0,0,0
c ends
code segment
start:
      ?
code ends
end start

 

程序如下:

;将a段和b段的数据依次相加,将结果存入到c段中
assume cs:code
a segment
 db 1,2,3,4,5,6,7,8
a ends

b segment
 db 1,2,3,4,5,6,7,8
b ends
cc segment
    db 0,0,0,0,0,0,0,0
cc ends

code segment
start:    mov ax,a
         mov ds,ax
         mov si,0
         mov cx,8
      s: mov ax,0
         add al,[0+si]
         add al,[16+si]
         mov [32+si],al
         inc si
         loop s
        
        mov ax,4c00h
       int 21h
       
 code ends
 end start

 在masmplus中 c segment 编译有问题,改为cc segment 就可以了,不知为什么。

这个程序关键是调试查看数据:

用debug将程序加载进内存后,r查看没执行指令的情况。其中

 ss=DS+10h; 

程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为0则程序所在内存区的地址为ds:0

这个内存区的前256个字节存放的是psp,dos用来和程序通信。所以程序的物理地址为:

   ds+10h;

 

cs和ss的差值为什么为3? 

是因为程序定义了3个段,定义的三个段的大小都小于16个字节。

若是在c段后面再定义一个段

d segment 
db 16 dup(1)
d ends

ss=14a5,cs=14a9

d segment
db 17 dup(1)
d ends

ss=14a5 ,cs=14aa

查看最终结果:

g运行完程序, d ss:0在查看段的内容。