热度 3|
1、assume是针对masm的,其位置可在代码段外,也可在代码段内,编译结果是相同的二进制文件;
2、assume指明assume后面的冒号后所列出的段寄存器与相应的段之间的关系,但在编译过程(.asm-->.obj)并没有将相应的段地址载入到相应的段寄存器中,如:
assume cs:code ,ds:data,ss:stack,es:a
data segment
var1 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
var2 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
a segment
var3 dw 0,0,0,0,0,0,0,0
a ends
code segment
start:
mov ax,data
mov ax,stack
mov ax,a
mov ax,var1+2
mov ax,var2
mov ax,var3
mov ax,4c00h
int 21h
code ends
end start
编译连接后,debug,结果:
由上图可以看出:
1、在源代码中,assume将data段与ds段寄存器相联系,assume将stack段与ss段寄存器相联系,assume将a段与es段寄存器相联系。编译载入内存后,data短的段地址是183fh,stack段的段地址是1840h,a段的段地址是1842h,而ds、ss、es所存的数据分别是182fh、183fh、182fh,即相应段的段地址未载入相应的段寄存器;
2、在源代码中,assume将data段与ds段寄存器相联系,assume将stack段与ss段寄存器相联系,assume将a段与es段寄存器相联系,变量标号var1在data段内,变量标号var2在stack段内,变量标号var3在a段内。编译载入内存后,变量标号被处理为偏移地址,变量标号var1+2所处理成为的偏移地址位于(ds)段内(mov指令默认的段寄存器是ds),变量标号var2所处理成为的偏移地址位于(ss)段内,变量标号var3所处理成为的偏移地址位于(es)段内,即assume指明assume后面的冒号后所列出的段寄存器与相应的段之间的关系。
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-5-13 00:30
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.