鱼C论坛

 找回密码
 立即注册

关于assume的一点探索

热度 3已有 589 次阅读2012-11-15 19:02 |个人分类:asm

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后面的冒号后所列出的段寄存器与相应的段之间的关系。


路过

鸡蛋
3

鲜花

握手

雷人

刚表态过的朋友 (3 人)

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 00:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部