网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月03日漏签0天
c语言吧 关注:800,866贴子:4,369,578
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回c语言吧
>0< 加载中...

隔壁汇编吧太冷了,借吧求问汇编语言伪指令assume的作用

  • 只看楼主
  • 收藏

  • 回复
  • 想个名字真几把
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如题,在学王爽汇编语言这本书。对assume的作用起了疑惑。书里讲:assume的作用是连接段名与段寄存器。
但是它真的连接了吗?如连。
譬如我在开头写:assume cs:code,ds:data,ss:stack
跟写assume cs:code的作用是一样的,编译器并不会自动把ds和ss指到对应的段寄存器
但是,倘若我把assume整行都删了,编译器又会报错,错误如下:missing or unreachable CS
您瞧瞧,CS却找不到要指向的地方了!
可是,书中不是说,cs指向哪里是由end决定的吗?end后面的标识符在哪编译器就把cs指到哪里,倘若没有就指向这份源程序的开头,为啥我不写assume它却不行了?
综上,我想知道编译器看见assume之后到底干了什么?assume的具体作用及作用机制到底是什么?
在此先拜谢各位大佬!!


  • 想个名字真几把
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶,还有一个疑问,如果我assume了一个段名,但是在下面的源程序中并没有
段名 segment
。。。
段名 ends
的定义,那么编译器依然会报错,这又是为啥?


2025-11-03 17:51:29
广告
不感兴趣
开通SVIP免广告
  • Dangfer
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
assume你可以理解为它进行了一个文本替换工作,把寄存器替换成了关联段
ds:[aaa] -> data1:[aaa]
譬如
data1 segment
aaa dw 1
data1 ends
data2 segment
bbb dw 2
aaa dw 1
data2 ends
然后在code段里写
mov ax, data2
mov ds, ax
assume ds:data1
mov cx, [aaa]
这样就会造成错误的偏移从而取到bbb的值
所以你进行了关联但是没有定义相关的段当然是错误的,编译器哪里知道你所关联的段在哪里
end所指的是程序的入口点,但是编译器仍然不知道cs所在的段
ds和ss需要你手动设置是因为命令行参数的需要,所以它们在程序开始运行时由系统赋值为psp的段地址


  • 骰子猫
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2年前学的,记忆有点模糊,以下内容可能有错。
这个声明其实没有进行所谓操作,仅仅只是声明cs段寄存器“应当装入的地址”,然后把这个声明写到可执行文件头,操作系统启动进程之前会帮你把声明好的段地址放到cs段寄存器中


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示