编程:编写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 就可以了,不知为什么。
这个程序关键是调试查看数据:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CZ2UjNjljN5ADZyIjZhlDO1ETZ0MWO3gjMyMWOwgTMy8CX0AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL3M3Lc9CX6MHc0RHaiojIsJye.png)
用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