|
主题 : : 实验5(5)(6) [已解决] |
回复[ 3次 ]
点击[ 480次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2009-09-11 02:20 ] | |
荣誉值:4
信誉值:0
注册日期:2008-12-24 23:48 |
实验5的第5个和第6个实验前面只定义了 assume cs:code 后面不用定义ds ss也可以通过
拿实验5的第6个程序说把 我的理解程序应该写成这样
assume cs:code,ds:a,ss:b
a segment
dw 1,2,3,4,5,6,7,8
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,16
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
问题是不用定义ds:a,ss:b程序也没问题 难道说assume 后面定义ds ss都是无所谓的 可以省略 ??? | | |
|
|
|
|
[第1楼] [ 回复时间:2009-09-11 09:09 ] | |
荣誉值:56
信誉值:0
注册日期:2008-01-19 13:58 |
对于这个程序来说是没有问题,但是对于在a段和b段中使用了标号(后面会讲到)的程序来说,就会出现问题。比如下面的程序:
assume cs:code,ds:a,ss:b
a segment
sega dw 1,2,3,4,5,6,7,8
a ends
b segment
segb dw 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov ax,sega[0]
mov ax,segb[0]
mov ax,4c00h
int 21h
code ends
end start
因为在a段和b段中分别定义了标号sega和segb,此时如果不写入ds:a,ss:b,那么编译是通不过的,也就是说编译器通过assume指令指定标号处所对应的段寄存器,它是与标号密切相关的。通过DEBUG查看,mov ax,sega[0]和mov ax,segb[0]两条指令分别被对应指令mov ax,[0000]和mov ax,ss:[0000],sega对应的段寄存器是DS,segb对应的段寄存器是SS。相反,如果把ds:a,ss:b改为ss:a,ds:b,编译连接后再通过DEBUG查看这两条指令,你就知道assume指令的作用了。
此外assume cs:code指令有时也是可以不写的,什么情况下呢?比如程序中不存在标号,如下:
code segment
mov ax,4c00h
int 21h
code ends
end
通过上面的分析,我们会发现程序通过assume指令指定了与标号相关的段寄存器,因为程序最终会被编译器编译为机器指令,那么如何根据程序中的标号把对应的汇编指令编译为正确的机器指令呢,assume伪指令就是起这个作用的。
------------------------------------------------------------------------------
以上结论都是根据自己的经验总结出来的,至于assume伪指令还有其它什么功能,本人就不太清楚了。 | | |
|