该死的phase error between passes,跪求大神指点

awfifcuihc 2016-05-25 11:30:22
assume cs:code

code segment
mov ax,stack1
mov ss,ax
mov sp,256
mov ax,flend[2]
mov bx,head[2]
sub ax,bx
mov bx,16
mul bx
push ax
mov ax,head
mov bx,flend
cmp ax,bx
ja abov
sub bx,ax
pop ax
add ax,bx
adc dx,0
jmp below
abov: sub ax,bx
mov bx,ax
pop ax
sub ax,bx
below: mov bx,512
div bx
inc ax
mov ax,cs
mov es,ax
mov bx,offset head
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3
int 13h

mov ax,4c00h
int 21h
org 200h
head dd head
flend dd fileend
........................................
code ends
stack1 segment
dw 128 dup (0)
fileend db 0
stack1 ends
end
如上代码,目的是根据两个以段地址:偏移地址格式的地址相减得到两个地址之间的距离,abov标号处显示phase error between passes,感觉这里不会有什么毛病啊,其实这种问题其实出过不止一次了,只是之前都想办法绕过去了,这次不能忍了
...全文
1802 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2016-05-27
  • 打赏
  • 举报
回复
编译原理,有这么个课程的吧,不过它和理解你这个错误关系倒不大。
zara 2016-05-26
  • 打赏
  • 举报
回复
phase error 这个错误确实很容易让刚接触汇编的人迷惑,主要是 Masm5 或更低的版本初次扫描对未曾定义过的引用预过小造成的,比如上面朋友提及的意料之外的段前缀,本来以为是 near 的后来发现竟然是 far 调用等等;最简单的解决方法,就是换用更高版本的汇编程序,masm6 甚至是 masm32 的,这些已经自己解决了这类问题了。
baidu_23107797 2016-05-26
  • 打赏
  • 举报
回复
这段代码里,区段(ds,cs,ss)的运行十分乱,尤其ss…….. 先不管这个… 所谓phase error是编译流程产生的问题 编译动作不是一次就完成的,有pass1,pass2…. Pass1 第一次碰到mov ax,flend[2]的时候,因为还未看到flend在哪里(因为它在最后) 这时编译器照旧为它编码.. 看起来就是 mov ax,[xxxx] pass2 第2次碰到mov ax,flend[2]的时候,因为pass1已经看见flend了,发现它在cs段 mov ax,[xxxx]的编码明显欠了一个段指示mov ax,cs:[xxxx] (且不管这也是错的,因为flend是dword,资料长度也不符) cs:是一个byte的长度,而这以下的代码已经编译了,没法挤进这个cs: 所以就phase error 解决方法自己想想吧,其中一个简单方法是:写代码时为它加一个段表示 mov ax,flend[2]改为 mov ax,word ptr cs:flend[2] 其它问题自己解决吧
awfifcuihc 2016-05-26
  • 打赏
  • 举报
回复
多谢大神们指导,有没有讲述这些个编译器编译原理的书推荐呢~整体的讲编译原理或者专门针对masm编译器的都行
awfifcuihc 2016-05-25
  • 打赏
  • 举报
回复
自己看了下代码里有一些逻辑错误,但是语法上应该这里没错吧

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧