求大神:这段汇编代码写入mbr之后,能装入并执行,但是显示不了我要的字符串

;;我想写一个mbr的引导代码,一部分写好后发现运行不正常,就改成下面这段测试代;;;码,见鬼的是:不论你是用0000:7c00h作为cs:ip来设置偏移量,还是改成现在这;;;;;样子用07c0::0000作为入口指针都无法正确读取程序内的字符串,不知道是偏移量设;;置问题,还是别的问题,如果去掉字符串,改用mov al,'a',inc al的办法来循环输出;;;;;单个字符就能正常显示。
;;??莫非mbr装入内存时也设置了PSP(程序段前缀),但是psp是由dos装入的啊。

;;这是安装程序,负责将bootstrap标号之后的代码先装入buff指向的512 byte内存,之后再将这段内存数据写入磁盘的mbr扇区

;;---------------安装程序------------------------------------------------------------
assume cs:code,ds:data,ss:stack
data segment
msg1 db 'written to disk successfully$'
buff db 510 dup(0)
db 55h,0aah
msg2 db 'failed to write to disk$'

data ends
stack segment
db 32 dup(0)

stack ends
code segment
main:
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
mov sp,32

;;将欲装入mbr的代码先装入buff定义的内存缓冲区,之后再利用int 13h写入磁盘
lea di,buff
lea si,bootstrap
push ds
push cs
pop ds
mov cx,bootstrap_end-bootstrap
cld
rep movsb
pop ds
;;int 13h 将缓冲区的512字节写入磁盘mbr

lea bx,buff
mov ax,0301h
mov ch,0
mov cl,1
mov dh,0
mov dl,82h;;我的U盘
int 13h

;;判断写入磁盘是否成功
cmp ah,0
je success;;成功就跳转
;;不成功就打印字符串到屏幕
mov cx,29
mov dh,12
mov dl,25
mov ah,13h ;the 13rd sub process of int 10 prints the string to the screen
mov al,0
mov bl,4
mov bh,0
lea bp,msg2
int 10h
jmp end1

;;成功也打印成功的提示信息到屏幕
success:
mov cx,29
mov dh,12
mov dl,25
mov ah,13h
mov al,0
mov bl,4
mov bh,0
lea bp,msg1
int 10h

end1:
mov ax, 4c00h ;;主程序结束
int 21h
------------------------------待安装代码---------------------------------------------

;;以下是将要写入mbr代码部分,到bootstrap_end 结束
bootstrap:
mov ax,0
mov ss,ax
mov sp,7c00h
mov ax,07c0h
mov ds,ax
;;利用retf 改变cs,ip饼跳转到go0标号处执行
push ax
mov ax,go0-bootstrap
push ax
retf
;;实现在屏幕上输出reset标号处的字符串
go0:
mov ax,0b800h
mov es,ax
mov di,800
mov bx,reset-bootstrap
sss1:
mov al,[bx]
cmp al,0
je sss2
mov es:[di],al
add bx,1
add di,2
jmp sss1

sss2:;;死循环
mov ah,0
int 16h
jmp sss2
reset: db 'reset pc$$$$$$$',0
bootstrap_end:
code ends
end main

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐