guotianss 2017-03-22 09:51
浏览 693

求大神:这段汇编代码写入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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 latex怎么处理论文引理引用参考文献
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?