当前位置: 代码迷 >> 汇编语言 >> A2096,A1010异常
  详细解决方案

A2096,A1010异常

热度:174   发布时间:2016-05-02 04:29:15.0
A2096,A1010错误
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程序时没问题,可以完整显示。

请各位帮我看看是什么问题,网上查资料也查不到具体是什么错误,谢谢各位了

------解决思路----------------------
这两点,其实是一个问题吧。
 不是不能有多个段,而是如果有则自己要进行处理,比如最简单的对段的引用 mov ax, data1 生成的是个需要重定位的指令,即作为普通的程序,dos 会根据程序载入的基址对其进行修正保证赋予 ax 的确实是指向了 data1 段;当其写入到引导部分时,没有了这个重定位操作,所以就得你自己来做,本来引导部分东西也不算太多,往往没有多段的必要,所以简单起见是不分段的。
  相关解决方案