编程:编写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在查看段的内容。