社区
汇编语言
帖子详情
关于伪指令assume
mic47
2010-12-19 04:01:34
一个汇编程序:
code segment
mov ax,1
add ax,ax
mov ax,4c00h
int 21h
code ends
end
不加前面的assume cs:code也行
但如果这样写:
code segment
start: mov ax,1
add ax,ax
mov ax,4c00h
int 21h
code ends
end start
就不行,请问高人是为什么呢?
...全文
322
11
打赏
收藏
关于伪指令assume
一个汇编程序: code segment mov ax,1 add ax,ax mov ax,4c00h int 21h code ends end 不加前面的assume cs:code也行 但如果这样写: code segment start: mov ax,1 add ax,ax mov ax,4c00h int 21h code ends end start 就不行,请问高人是为什么呢?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mic47
2010-12-22
打赏
举报
回复
[Quote=引用 10 楼 shzhfu 的回复:]
引用 9 楼 mic47 的回复:
也就是说,assume cs:code是给code段中的标号找了个段寄存器,就这点作用吗?
是的,只要定义了变量、标号和过程等,就一定要把所在的段进行ASSUME设定,让编译器知道这个“标示符”的所有属性(包括段属性)。否则编译器无法建立“标识符”与“实际地址”之间的对应表。
[/Quote]
那assume ds:data,ss:stack是不是没用啊?
假如我有一个数据和一个栈段
shzhfu
2010-12-20
打赏
举报
回复
[Quote=引用 9 楼 mic47 的回复:]
也就是说,assume cs:code是给code段中的标号找了个段寄存器,就这点作用吗?
[/Quote]
是的,只要定义了变量、标号和过程等,就一定要把所在的段进行ASSUME设定,让编译器知道这个“标示符”的所有属性(包括段属性)。否则编译器无法建立“标识符”与“实际地址”之间的对应表。
mic47
2010-12-20
打赏
举报
回复
[Quote=引用 8 楼 shzhfu 的回复:]
引用 7 楼 mic47 的回复:
那这样一段程序,没有设置程序入口,怎么也编译不对啊?
code segment
mov ax,0
s: mov ax,4c00h
int 21h
code ends
end
尽管没有入口地址,但出现了标号s,编译工具是要知道s和哪个段寄存器关联的。
[/Quote]
也就是说,assume cs:code是给code段中的标号找了个段寄存器,就这点作用吗?
shzhfu
2010-12-20
打赏
举报
回复
[Quote=引用 7 楼 mic47 的回复:]
那这样一段程序,没有设置程序入口,怎么也编译不对啊?
code segment
mov ax,0
s: mov ax,4c00h
int 21h
code ends
end
[/Quote]
尽管没有入口地址,但出现了标号s,编译工具是要知道s和哪个段寄存器关联的。
mic47
2010-12-20
打赏
举报
回复
[Quote=引用 1 楼 zybzyb1987 的回复:]
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其……
[/Quote]
那这样一段程序,没有设置程序入口,怎么也编译不对啊?
code segment
mov ax,0
s: mov ax,4c00h
int 21h
code ends
end
lxy15329
2010-12-19
打赏
举报
回复
如果对反汇编有些了解,你会知道,其实程序执行时是根据那个程序最后end ?来决定起点在哪里的
znxllyuan
2010-12-19
打赏
举报
回复
[Quote=引用 4 楼 shzhfu 的回复:]
引用 1 楼 zybzyb1987 的回复:
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume……
[/Quote]
支持牧人大叔~
shzhfu
2010-12-19
打赏
举报
回复
[Quote=引用 1 楼 zybzyb1987 的回复:]
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其……
[/Quote]
补充:
变量、标号和过程等,在编译时都要换成其地址,包括偏移地址和段地址,但在引用时,有些情况下段地址可以省略,如ds:[偏移地址]中的ds等。那么编译工具要不要把段地址省略,它就看assume把这个段关联给哪个段寄存器了。
所以第一个出现没有变量和标号等,不涉及判断段地址的问题;而第二个程序出现了标号,就要看这个标号关联到哪个段寄存器。
znxllyuan
2010-12-19
打赏
举报
回复
同意1L
masmaster
2010-12-19
打赏
举报
回复
同意LS观点。
zybzyb1987
2010-12-19
打赏
举报
回复
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其他如DS,SS只是一个默认使用的约定,而其实际值为多少,CPU是不管的,所以一定要根据程序需要手动的将其设置为相关段的地址。
伪指令
及其作用
伪指令
及其作用
汇编常用
伪指令
表
汇编常用
伪指令
表
51单片机汇编语言指令以及
伪指令
速查手册
六、
伪指令
DW 定义字(2字节) PROC 定义过程 ENDP 过程结束 SEGMENT 定义段 AS
SUM
E 建立段寄存器寻址 ENDS 段结束 END 程序结束
单片微机原理及应用第4章2
伪指令
共59页.pdf.zip
单片微机原理及应用第4章2
伪指令
共59页.pdf.zip
汇编程序常用
伪指令
简介.pptx
汇编程序常用
伪指令
简介.pptx
汇编语言
21,497
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章