这本书里的课程设计2是对我们这个课程的学习进行总结的一个很好的练习,几乎用到了这本书所涉及到的所有知识和编程技巧。这本书的教学方式也是很不错的,把知识点分散开来,用到什么讲什么,让我们学习有了目的性,不会在学习的过程中迷失方向,不知所云。每次教的内容基本都是下一部分内容的基础,循序渐进,方便我们接受。正因为这样,这本书很适合自学。本人就是通过自学这本书来学习汇编的,学的很轻松,不知不觉就学完了这本书,掌握了知识。在这里一定要给这本书和写这本书的王爽老师给个好评。
回到课程设计2上来,这个课程设计本身还是有一定难度的,我刚开始也遇到了一些问题, 不知道该怎么写,知道该怎么写了之后,有时还会遇到一些莫名其妙的bug。我通过不断复习这本书,并且在网上参考了一些别人写的程序,又通过不断调试,经过了差不多一个月,终于把课程设计2完成了,并且调试通过。这时我就感觉我的学习是有收获的,而且受益良多。现在,我就把我写的程序分享在这里,供需要的人进行参考。另外程序是在VMware虚拟机中运行的,里面装的是DOS7.1操作系统。
assume cs:code,ss:stack,ds:data
data segment
setup_check dw offset setup_success_message,offset setup_fail_message ;安装信息地址表。
setup_success_message db "Setup success,please reboot system.",0 ;安装成功。
setup_fail_message db "Setup fail!",0 ;安装失败。
data ends
stack segment
db 16 dup (0)
stack ends
code segment
start:
;===========================================================
;= 安装程序 =
;===========================================================
mov bx,stack
mov ss,bx
mov sp,16
mov ax,data
mov ds,ax
;将引导程序写入软驱a中的软盘,存储在0面0道1扇区,用来向内存读入主程序。
mov bx,cs
mov es,bx
mov bx,offset introduce
mov al,1
mov ch,0
mov cl,1
mov dh,0
mov dl,0
mov ah,3
int 13h
;检查安装是否成功。
cmp ah,0
jne show_setup_message
;将主程序写入软驱a中的软盘,从0面0道2扇区开始存储。
mov bx,cs
mov es,bx
mov bx,offset main_sub
mov ax,offset main_sub_end-offset main_sub ;计算主程序长度,从而知道要用多少个扇区存储。
mov dx,0
mov cx,512
div cx
cmp dx,0
je judge_rem_setup
inc ax
judge_rem_setup: ;al=写入的扇区数,ah=0。
mov ch,0
mov cl,2
mov dh,0
mov dl,0
mov ah,3
int 13h
;显示安装是否成功。
show_setup_message:
call cls
cmp ah,0
je setup_check_over
mov ah,2
setup_check_over:
mov al,ah
mov ah,0
mov si,ax
mov si,ds:[si]
mov dh,12
mov dl,23
mov cl,7
call show_str0
mov ax,4c00h
int 21h
;===========================================================
;===========================================================
;= 引导程序 =
;===========================================================
introduce:
jmp short begin_introduce
stack_introduce db 16 dup (0) ;引导程序使用的栈段。
;将主程序从软驱a中的软盘读出,从0:7e00h开始存储。
begin_introduce:
mov ax,0
mov ss,ax
mov sp,offset stack_introduce-offset introduce+16+7c00h
mov bx,0
mov es,bx
mov bx,7e00h
mov ax,offset main_sub_end-offset main_sub ;计算主程序长度,从而知道主程序在多少个扇区中存储。
mov dx,0
mov c