mov ax,0xb800 ;指向文本模式的显示缓冲区
mov es,ax
;以下显示字符串"Label offest:" ;在屏幕上显示数据只要把相应的数据写到内存中显存相映射的位置就行
mov byte[es:0x00],'L' ;源操作数是内存,目的操作数是立即数,则要在内存前加 byte或word表示移动的是一个字节或一个字
mov byte[es:0x01],0x07 ;在显存中显示文本时,第一个字节是要显示的文本,第二个字节表示格式,0x07表示的就是格式
mov byte[es:0x02],'a'
mov byte[es:0x03],0x07
mov byte[es:0x04],'b'
mov byte[es:0x05],0x07
mov byte[es:0x06],'e'
mov byte[es:0x07],0x07
mov byte[es:0x08],'l'
mov byte[es:0x09],0x07
mov byte[es:0x0a],' '
mov byte[es:0x0b],0x07
mov byte[es:0x0c],'o'
mov byte[es:0x0d],0x07
mov byte[es:0x0e],'f'
mov byte[es:0x0f],0x07
mov byte[es:0x10],'f'
mov byte[es:0x11],0x07
mov byte[es:0x12],'e'
mov byte[es:0x13],0x07
mov byte[es:0x14],'s'
mov byte[es:0x15],0x07
mov byte[es:0x16],'t'
mov byte[es:0x17],0x07
mov byte[es:0x18],':'
mov byte[es:0x19],0x07
mov ax,number ;取得标号number的偏移地址
mov bx,10
;设置数据段的基地址 ;把数据段的基地址设置成代码段的基地址,因为数据已经和代码混在一起
mov cx,cs
mov ds,cx
;求个位上的数字
mov dx,0
div bx
mov [0x7c00+number+0x00],dl ;保存个位上的数字
;求十位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x01],dl ;保存十位上的数字
;求百位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x02],dl ;保存百位上的数字
;求千位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x03],dl ;保存千位上的数字
;求万位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x04],dl ;保存万位上的数字
;以下用十进制显示标号的偏移地址
mov al,[0x7c00+number+0x04]
add al,0x30
mov [es:0x1a],al
mov byte[es:0x1b],0x04
mov al,[0x7c00+number+0x03]
add al,0x30
mov [es:0x1c],al
mov byte[es:0x1d],0x04
mov al,[0x7c00+number+0x02]
add al,0x30
mov [es:0x1e],al
mov byte[es:0x1f],0x04
mov al,[0x7c00+number+0x01]
add al,0x30
mov [es:0x20],al
mov byte[es:0x21],0x04
mov al,[0x7c00+number+0x00]
add al,0x30
mov [es:0x22],al
mov byte[es:0x23],0x04
mov byte[es:0x24],'D'
mov byte[es:0x25],0x07
infi:jmp near infi ;无限循环,为了避免访问到数据,以至于改变数据内容
number db 0,0,0,0,0
times 203 db 0 如果文件的字节没到一个扇区的字节数,则需要填充
db 0x55,0xaa ;主扇区的最后两个字节是0x55,0xaa
mov es,ax
;以下显示字符串"Label offest:" ;在屏幕上显示数据只要把相应的数据写到内存中显存相映射的位置就行
mov byte[es:0x00],'L' ;源操作数是内存,目的操作数是立即数,则要在内存前加 byte或word表示移动的是一个字节或一个字
mov byte[es:0x01],0x07 ;在显存中显示文本时,第一个字节是要显示的文本,第二个字节表示格式,0x07表示的就是格式
mov byte[es:0x02],'a'
mov byte[es:0x03],0x07
mov byte[es:0x04],'b'
mov byte[es:0x05],0x07
mov byte[es:0x06],'e'
mov byte[es:0x07],0x07
mov byte[es:0x08],'l'
mov byte[es:0x09],0x07
mov byte[es:0x0a],' '
mov byte[es:0x0b],0x07
mov byte[es:0x0c],'o'
mov byte[es:0x0d],0x07
mov byte[es:0x0e],'f'
mov byte[es:0x0f],0x07
mov byte[es:0x10],'f'
mov byte[es:0x11],0x07
mov byte[es:0x12],'e'
mov byte[es:0x13],0x07
mov byte[es:0x14],'s'
mov byte[es:0x15],0x07
mov byte[es:0x16],'t'
mov byte[es:0x17],0x07
mov byte[es:0x18],':'
mov byte[es:0x19],0x07
mov ax,number ;取得标号number的偏移地址
mov bx,10
;设置数据段的基地址 ;把数据段的基地址设置成代码段的基地址,因为数据已经和代码混在一起
mov cx,cs
mov ds,cx
;求个位上的数字
mov dx,0
div bx
mov [0x7c00+number+0x00],dl ;保存个位上的数字
;求十位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x01],dl ;保存十位上的数字
;求百位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x02],dl ;保存百位上的数字
;求千位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x03],dl ;保存千位上的数字
;求万位上的数字
xor dx,dx
div bx
mov [0x7c00+number+0x04],dl ;保存万位上的数字
;以下用十进制显示标号的偏移地址
mov al,[0x7c00+number+0x04]
add al,0x30
mov [es:0x1a],al
mov byte[es:0x1b],0x04
mov al,[0x7c00+number+0x03]
add al,0x30
mov [es:0x1c],al
mov byte[es:0x1d],0x04
mov al,[0x7c00+number+0x02]
add al,0x30
mov [es:0x1e],al
mov byte[es:0x1f],0x04
mov al,[0x7c00+number+0x01]
add al,0x30
mov [es:0x20],al
mov byte[es:0x21],0x04
mov al,[0x7c00+number+0x00]
add al,0x30
mov [es:0x22],al
mov byte[es:0x23],0x04
mov byte[es:0x24],'D'
mov byte[es:0x25],0x07
infi:jmp near infi ;无限循环,为了避免访问到数据,以至于改变数据内容
number db 0,0,0,0,0
times 203 db 0 如果文件的字节没到一个扇区的字节数,则需要填充
db 0x55,0xaa ;主扇区的最后两个字节是0x55,0xaa
本文记录了如何编写主引导扇区(MBR)代码,详细解释了如何在文本模式下显示字符串并转换十进制数字,同时展示了如何利用汇编语言进行数值计算和屏幕输出。
3907

被折叠的 条评论
为什么被折叠?



