A2096,A1010错误

qnapjiujiu 2014-12-30 09:36:25
assume cs:code 

stack segment
dw 100 dup(0)
stack ends

code segment
start:
mov ax, stack
mov ss,ax
mov sp,100

mov ax,code
mov es,ax
mov bx,offset shanqu1

mov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13h

mov ax,code
mov es,ax
mov bx,offset shanqu2

mov al,2
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3
int 13h

mov ax,4c00h
int 21h

shanqu1:
mov ax,0
mov es,ax
mov bx,200h

mov al,2
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h

;jmp 0:200;为什么报错A2096

shanqu1end:nop

shanqu2:
assume cs:code1

data1 segment
str1 db '1) reset pc',0
str2 db '2) start system',0
str3 db '3) clock',0
str4 db '4) set clock',0
data1 ends

stack1 segment
dw 100 dup(0)
stack1 ends

code1 segment

start1:
mov ax, stack1
mov ss,ax
mov sp,100

mov dh,10;显示的行号
mov dl,15;显示的列号
mov cl,4ah
mov ax,data1
mov ds,ax
mov bx,offset str1
call show_str;调用显示字符串函数
mov dh,11;显示的行号
mov dl,15;显示的列号
mov cl,4ah
mov ax,data1
mov ds,ax
mov bx,offset str2
call show_str;调用显示字符串函数
mov dh,12;显示的行号
mov dl,15;显示的列号
mov cl,4ah
mov bx,offset str3
call show_str;调用显示字符串函数
mov dh,13;显示的行号
mov dl,15;显示的列号
mov cl,4ah
mov bx,offset str4
call show_str;调用显示字符串函数

;显示字符串函数\/
show_str:
push ax
push bx
push cx
push dx
push es
push si
push cx
mov al,160
dec dh
mul dh
push ax
mov al,2
dec dl
mul dl
pop si
add si,ax
mov ax,0b800h
mov es,ax
pop dx

mov ch,0
;pop si

s: mov cl,ds:[bx]
jcxz ok
mov al,ds:[bx]
mov es:[si],al
mov es:[si+1],dl
inc bx
add si,2
jmp short s

ok:
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
;显示字符串函数^

code1 ends
end start1

shanqu2end:nop

code ends
end start


这个程序实现的功能是把两段程序:shanqu1;shanqu2分别写入软盘A的第1扇区和第2,3扇区,shanqu1程序负责把第2,3扇区的程序读到内存0:200处并执行,shanqu2程序打负责印字符串出来。
现在的问题是:
1、jmp 0:200 ;这条指令编译时报错A2096(在不写入shanqu2程序的情况下)

2、写入shanqu2程序后,编译报错:A1010,但是单独运行shanqu2程序时没问题,可以完整显示。

请各位帮我看看是什么问题,网上查资料也查不到具体是什么错误,谢谢各位了
...全文
438 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qnapjiujiu 2015-01-22
  • 打赏
  • 举报
回复
改写clock子程序后的代码:
qnapjiujiu 2015-01-22
  • 打赏
  • 举报
回复
改写clock子程序后的代码:
zara 2015-01-05
  • 打赏
  • 举报
回复
1. 放到扇区里,数据不能这么组织,shanqu2 部分还分成了多个段,直接使用段,这些在引导时都是不符号条件的;写入到扇区在引导时使用,就要按照那个情景下的条件来组织代码和数据。
2. 不应该发生你说的情况吧,除非不是从 start: 开始运行的,因为从 start: 开始运行的话,写了两个扇区后,就调用 dos 的结束程序功能了。
qnapjiujiu 2015-01-05
  • 打赏
  • 举报
回复
引用 17 楼 zara 的回复:
这两点,其实是一个问题吧。 不是不能有多个段,而是如果有则自己要进行处理,比如最简单的对段的引用 mov ax, data1 生成的是个需要重定位的指令,即作为普通的程序,dos 会根据程序载入的基址对其进行修正保证赋予 ax 的确实是指向了 data1 段;当其写入到引导部分时,没有了这个重定位操作,所以就得你自己来做,本来引导部分东西也不算太多,往往没有多段的必要,所以简单起见是不分段的。
谢谢zara,您完美的解决了我的问题,感谢您多次的帮助!
zara 2015-01-05
  • 打赏
  • 举报
回复
这两点,其实是一个问题吧。
不是不能有多个段,而是如果有则自己要进行处理,比如最简单的对段的引用 mov ax, data1 生成的是个需要重定位的指令,即作为普通的程序,dos 会根据程序载入的基址对其进行修正保证赋予 ax 的确实是指向了 data1 段;当其写入到引导部分时,没有了这个重定位操作,所以就得你自己来做,本来引导部分东西也不算太多,往往没有多段的必要,所以简单起见是不分段的。
qnapjiujiu 2015-01-05
  • 打赏
  • 举报
回复
引用 15 楼 zara 的回复:
1. 放到扇区里,数据不能这么组织,shanqu2 部分还分成了多个段,直接使用段,这些在引导时都是不符号条件的;写入到扇区在引导时使用,就要按照那个情景下的条件来组织代码和数据。 2. 不应该发生你说的情况吧,除非不是从 start: 开始运行的,因为从 start: 开始运行的话,写了两个扇区后,就调用 dos 的结束程序功能了。
谢谢zara,还是有些不明白: 1、您的意思是写入扇区的数据不能分成多个段?也不能直接使用段?这仅仅是引导时的限制,还是所有的写入扇区的数据时都有这个限制?为什么有这个限制? 2、“写入到扇区在引导时使用,就要按照那个情景下的条件来组织代码和数据。”这个情景下的条件是什么?
qnapjiujiu 2015-01-04
  • 打赏
  • 举报
回复
引用 8 楼 zara 的回复:
终止源程序处理的是 end start 这样的语句,而不是 code ends 这样的语句,所以,不存在后面的语句不会形成数据或指令
1、如果将 code ends 语句挪到 data1 segment... 语句之前,那么code ends就存在于shanqu2这个独立的程序中,而且会被写入磁盘中,当运行shanqu2程序时会受影响吗?我单独测试shanqu2程序时没有问题,但是写入扇区后启动dos系统(从磁盘启动),理论应该显示字符,但是没有显示,这是因为coe ends 影响的吗? 2、我想再运行主程序的时候单纯实现复制的功能,不运行子程序。可是分成两个代码段后,子程序也运行了,请问如何不让子程序运行又可以实现复制的功能?
qnapjiujiu 2015-01-04
  • 打赏
  • 举报
回复
求大神帮忙啊
qq_25006157 2015-01-02
  • 打赏
  • 举报
回复
swad2wawadawdaw
zara 2014-12-31
  • 打赏
  • 举报
回复
1. jmp 0:200h 确实是有这个指令的,但编译器 masm 不支持,可能是这个指令不太靠谱吧。要实现这个指令,除了 #1 所说的方法外,将 0:200h 压栈然后 retf 也可以,或者是自己直接编码:db 0EAh, 00, 02, 00, 00
2. 这个是由于没有 code ends 语句,在 shanqu2: 之后加上吧。
qnapjiujiu 2014-12-31
  • 打赏
  • 举报
回复
引用 1 楼 a1193561652 的回复:
我复制你的编译的时候报错是A2038:left operand must have segment。 左边得操作数必须是段? 我网上找了下,应该是有jmp 0:200的用法呀。也不知道是怎么回事,坐等大神吧。 不过你可以先把0:200存到数据段里再用jmp dword ptr [bx]跳转,我试了试,这个没有报错。
这个我试了,确实可以,就是编译器 masm 不支持
qnapjiujiu 2014-12-31
  • 打赏
  • 举报
回复
还有个问题:我想再运行主程序的时候单纯实现复制的功能,不运行子程序。可是分成两个代码段后,子程序也运行了,请问如何不让子程序运行又可以实现复制的功能?
qnapjiujiu 2014-12-31
  • 打赏
  • 举报
回复
引用 8 楼 zara 的回复:
终止源程序处理的是 end start 这样的语句,而不是 code ends 这样的语句,所以,不存在后面的语句不会形成数据或指令
如果将 code ends 语句挪到 data1 segment... 语句之前,那么code ends就存在于shanqu2这个独立的程序中,而且会被写入磁盘中,当运行shanqu2程序时会受影响吗? 还有就是为什么code ends移到shanqu2前面会报错?除了“mov bx,offset shanqu2”这条语句找不到shanqu2程序之外,是不是标号写在了段的外面会报错误?
zara 2014-12-31
  • 打赏
  • 举报
回复
终止源程序处理的是 end start 这样的语句,而不是 code ends 这样的语句,所以,不存在后面的语句不会形成数据或指令
qnapjiujiu 2014-12-31
  • 打赏
  • 举报
回复
引用 6 楼 zara 的回复:
1. 最后那个不对,end xxxx 之后的语句是不会形成数据或指令的,所以它们不可能被写入到扇区,哪怕是在写入时给了足够的长度,但后面并没有那些所设想的内容而只是前面的程序在内存里留下的对你来说是无意义的乱码。 2. 这个做法,编译是通过了;看了下额外生成的 .lst 文件,code 在 data1 segmeng ... 语句后就自动结束了,所以还是将 code ends 语句挪到 data1 segment... 语句之前更合适。
我的目的是让主程序把shanqu2的程序写入磁盘,那么将 code ends 语句挪到 data1 segment... 语句之前的话,后面的语句不会形成数据或指令,所以它们不可能被写入到扇区。那我的目的就不能达到了啊,这样还能起作用吗?
zara 2014-12-31
  • 打赏
  • 举报
回复
1. 最后那个不对,end xxxx 之后的语句是不会形成数据或指令的,所以它们不可能被写入到扇区,哪怕是在写入时给了足够的长度,但后面并没有那些所设想的内容而只是前面的程序在内存里留下的对你来说是无意义的乱码。
2. 这个做法,编译是通过了;看了下额外生成的 .lst 文件,code 在 data1 segmeng ... 语句后就自动结束了,所以还是将 code ends 语句挪到 data1 segment... 语句之前更合适。
qnapjiujiu 2014-12-31
  • 打赏
  • 举报
回复
引用 4 楼 zara 的回复:
段定义是不可以嵌套的;遇到 end xxxx 语句后就结束源程序的处理了,后面的都不起作用;code 和 code1 要分成两个段定义。
1、如果分成两个段定义,遇到 end xxxx 语句后就结束源程序的处理了,那么后面的段是不是就不会被编译了?那复制到扇区也不会起作用了?我这样理解对吗? 2、我把end start1注释掉就没有错误了,这样做可以吗?这样能够实现程序本来的作用吗?
zara 2014-12-31
  • 打赏
  • 举报
回复
段定义是不可以嵌套的;遇到 end xxxx 语句后就结束源程序的处理了,后面的都不起作用;code 和 code1 要分成两个段定义。
qnapjiujiu 2014-12-31
  • 打赏
  • 举报
回复
引用 2 楼 zara 的回复:
1. jmp 0:200h 确实是有这个指令的,但编译器 masm 不支持,可能是这个指令不太靠谱吧。要实现这个指令,除了 #1 所说的方法外,将 0:200h 压栈然后 retf 也可以,或者是自己直接编码:db 0EAh, 00, 02, 00, 00。 2. 这个是由于没有 code ends 语句,在 shanqu2: 之后加上吧。
第一个问题明白了,谢谢 第二个问题,您是指shanqu2代码中没有code ends吗?我把code段写成code1段了(因为怕和主程序冲突),且在后面加了code1 ends。我没理解明白,你是指的哪个位置缺少code ends?
纵横车 2014-12-30
  • 打赏
  • 举报
回复
我复制你的编译的时候报错是A2038:left operand must have segment。 左边得操作数必须是段? 我网上找了下,应该是有jmp 0:200的用法呀。也不知道是怎么回事,坐等大神吧。 不过你可以先把0:200存到数据段里再用jmp dword ptr [bx]跳转,我试了试,这个没有报错。

21,459

社区成员

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

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