15218524174 发表于 2021-11-23 10:22:47

编写程序,读两个扇区,显示到屏幕Hello world

将“ hello”和 world”两个字符串分别写到第 100和 101扇区,编写程序 test13-3.asm读取这二个扇区,并将两个字符串显示到屏幕上。程序运行后如图:
data:image/png;base64,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


ps:有没有学汇编的一起来交流一下!

jackz007 发表于 2021-11-23 11:07:02

      绝对写磁盘扇区是一件非常危险事情,必须十分慎重,闹不好,会破坏磁盘关键数据,例如,FAT 扇区、目录扇区等内容,从而对磁盘的安全健康状态造成不可逆的损害。

15218524174 发表于 2021-11-23 20:05:23

jackz007 发表于 2021-11-23 11:07
绝对写磁盘扇区是一件非常危险事情,必须十分慎重,闹不好,会破坏磁盘关键数据,例如,FAT 扇区、 ...

在Ubuntu构建的虚拟硬盘,和虚拟机,这只是学习所需。

人造人 发表于 2021-11-23 20:46:24

read.s
    .code16
    .globl_start
_start:
    lgdtw   gdtr + 0x7c00

    # 打开A20地址线
    inb   $0x92, %al
    orb   $0x02, %al
    outb    %al, $0x92

    cli         # bootsect不打算建立保护模式下的中断机制

    # 进入保护模式
    movl    %cr0, %eax
    orl   $1, %eax
    movl    %eax, %cr0
    ljmpl   $8, $flush + 0x7c00

    .code32
flush:
    movw    $16, %ax
    movw    %ax, %ds
    movw    %ax, %es
    movw    %ax, %fs
    movw    %ax, %gs
    movw    %ax, %ss
    movl    $0xa0000, %esp

    movl    %esp, %ebp
    subl    $512, %esp
    subl    $8, %esp

    leal    -512(%ebp), %eax
    movl    $100, %ebx
    movl    %eax, (%esp)
    movl    %ebx, 4(%esp)
    calll   read_sect

    leal    -512(%ebp), %ebx
    movb    (%ebx), %al
    movb    %al, 0xb8000
    movb    1(%ebx), %al
    movb    %al, 0xb8002
    movb    2(%ebx), %al
    movb    %al, 0xb8004
    movb    3(%ebx), %al
    movb    %al, 0xb8006
    movb    4(%ebx), %al
    movb    %al, 0xb8008

    leal    -512(%ebp), %eax
    movl    $101, %ebx
    movl    %eax, (%esp)
    movl    %ebx, 4(%esp)
    calll   read_sect

    leal    -512(%ebp), %ebx
    movb    (%ebx), %al
    movb    %al, 0xb80a0
    movb    1(%ebx), %al
    movb    %al, 0xb80a2
    movb    2(%ebx), %al
    movb    %al, 0xb80a4
    movb    3(%ebx), %al
    movb    %al, 0xb80a6
    movb    4(%ebx), %al
    movb    %al, 0xb80a8

1:
    hlt
    jmp 1b

#void read_sect(uint8_t *buf, size_t start_sect);
read_sect:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %edi

    # 读取1个扇区
    movb    $1, %al
    movl    $0x1f2, %edx
    outb    %al, %dx

    # 下面发送逻辑扇区号
    # 0~7
    movl    12(%ebp), %ecx
    movl    %ecx, %eax
    movl    $0x1f3, %edx
    outb    %al, %dx

    # 8~15
    movl    %ecx, %eax
    shrl    $8, %eax
    movl    $0x1f4, %edx
    outb    %al, %dx

    # 16~23
    movl    %ecx, %eax
    shrl    $16, %eax
    movl    $0x1f5, %edx
    outb    %al, %dx

    # LBA28模式, 主盘
    # LBA地址24~27
    movl    %ecx, %eax
    shrl    $24, %eax
    andl    $0x0f, %eax
    orl   $0xe0, %eax
    movl    $0x1f6, %edx
    outb    %al, %dx

    # 发送读命令
    movb    $0x20, %al
    movl    $0x1f7, %edx
    outb    %al, %dx

    # 等待硬盘准备好
.L1:
    inb   %dx, %al
    andb    $0x88, %al
    cmpb    $0x08, %al
    jne   .L1

    # 从硬盘读取数据
    movl    8(%ebp), %edi
    movl    $256, %ecx
    movl    $0x1f0, %edx
    cld
    rep   insw

    popl    %edi
    popl    %ebp
    retl

    .align4
gdt:
    # 空描述符
    .int    0, 0

    # 代码段描述符
    # 段基地址: 0
    # 段界限:   4GB
    .int    0x0000ffff, 0x00cf9a00

    # 数据段描述符
    # 段基地址: 0
    # 段界限:   4GB
    .int    0x0000ffff, 0x00cf9200
gdtr:
    .short(. - gdt - 1)
    .int    (gdt + 0x7c00)


write.s
    .code16
    .globl_start
_start:
    lgdtw   gdtr + 0x7c00

    # 打开A20地址线
    inb   $0x92, %al
    orb   $0x02, %al
    outb    %al, $0x92

    cli         # bootsect不打算建立保护模式下的中断机制

    # 进入保护模式
    movl    %cr0, %eax
    orl   $1, %eax
    movl    %eax, %cr0
    ljmpl   $8, $flush + 0x7c00

    .code32
flush:
    movw    $16, %ax
    movw    %ax, %ds
    movw    %ax, %es
    movw    %ax, %fs
    movw    %ax, %gs
    movw    %ax, %ss
    movl    $0xa0000, %esp

    movl    %esp, %ebp
    subl    $512, %esp
    subl    $8, %esp

    leal    -512(%ebp), %ebx
    movb    $'h', (%ebx)
    movb    $'e', 1(%ebx)
    movb    $'l', 2(%ebx)
    movb    $'l', 3(%ebx)
    movb    $'o', 4(%ebx)

    leal    -512(%ebp), %eax
    movl    $100, %ebx
    movl    %eax, (%esp)
    movl    %ebx, 4(%esp)
    calll   write_sect

    leal    -512(%ebp), %ebx
    movb    $'w', (%ebx)
    movb    $'o', 1(%ebx)
    movb    $'r', 2(%ebx)
    movb    $'l', 3(%ebx)
    movb    $'d', 4(%ebx)

    leal    -512(%ebp), %eax
    movl    $101, %ebx
    movl    %eax, (%esp)
    movl    %ebx, 4(%esp)
    calll   write_sect

1:
    hlt
    jmp 1b

#void write_sect(const uint8_t *buf, size_t start_sect);
write_sect:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %esi

    # 写入1个扇区
    movb    $1, %al
    movl    $0x1f2, %edx
    outb    %al, %dx

    # 下面发送逻辑扇区号
    # 0~7
    movl    12(%ebp), %ecx
    movl    %ecx, %eax
    movl    $0x1f3, %edx
    outb    %al, %dx

    # 8~15
    movl    %ecx, %eax
    shrl    $8, %eax
    movl    $0x1f4, %edx
    outb    %al, %dx

    # 16~23
    movl    %ecx, %eax
    shrl    $16, %eax
    movl    $0x1f5, %edx
    outb    %al, %dx

    # LBA28模式, 主盘
    # LBA地址24~27
    movl    %ecx, %eax
    shrl    $24, %eax
    andl    $0x0f, %eax
    orl   $0xe0, %eax
    movl    $0x1f6, %edx
    outb    %al, %dx

    # 发送写命令
    movb    $0x30, %al
    movl    $0x1f7, %edx
    outb    %al, %dx

    # 等待硬盘准备好
.L1:
    inb   %dx, %al
    andb    $0x88, %al
    cmpb    $0x08, %al
    jne   .L1

    # 把数据写入硬盘
    movl    8(%ebp), %esi
    movl    $256, %ecx
    movl    $0x1f0, %edx
    cld
    rep   outsw

    popl    %esi
    popl    %ebp
    retl

    .align4
gdt:
    # 空描述符
    .int    0, 0

    # 代码段描述符
    # 段基地址: 0
    # 段界限:   4GB
    .int    0x0000ffff, 0x00cf9a00

    # 数据段描述符
    # 段基地址: 0
    # 段界限:   4GB
    .int    0x0000ffff, 0x00cf9200
gdtr:
    .short(. - gdt - 1)
    .int    (gdt + 0x7c00)


15218524174 发表于 2021-11-24 21:34:06

                        ;文件名:port_hd_hello.asm
                        ;功能:1.读取硬盘逻辑扇区号100处的1个扇区到物理内存0x10000处
                        ;      2.并显示扇区开头的‘hello'
                        ;           3.MBR程序
                        ;目的:练习对硬盘的端口访问
                        ;说明:本末终始2020-11-24,参考李忠c08_mbr.asm
                        app_lba_start equ 100                ;'hello'在第100扇区(LBA)
SECTION hello align=16 vstart=0x7c00
                        ;设置堆栈段和栈指令
                        xor ax,ax
                        mov ss,ax
                        mov sp,ax
                       
                        ;设置DS和ES
                        mov ax,0x1000                                ;0x10000的段地址,接收扇区来的数据
                        mov ds,ax
                        mov es,ax
                       
                        ;调用call及参数设置:扇区号和装载内存偏移地址
                        xor di,di
                        mov si,app_lba_start                ;di:si:逻辑扇区号100
                        xor bx,bx                                        ;装载扇区的内存区偏移地址0
                        call read_hard_disk_0                ;从硬盘读取一个逻辑扇区,到DS:BX(内存0x10000)。引自李忠c08_mbr.asm
                       
                        ;显示'hello'5个字符到0xb8000
                        mov ax,0xb800
                        mov es,ax
                        xor si,si
                        xor di,di
                        mov cx,5                                        ;显示'hello'5个字符
disp:
                        mov al,
                        mov ah,0x07
                        mov ,ax
                        inc si
                        inc di
                        inc di
                        loop disp
                       
                        jmp $                                                ;程序结束
                       
;-----------------------------------------------------------------------------

read_hard_disk_0:                        ;从硬盘读取一个逻辑扇区
                                       ;输入:DI:SI=起始逻辑扇区号
                                       ;      DS:BX=目标缓冲区地址
                       push ax                                                ;过程中使用,端口数据
                       push bx                                                ;过程中使用,退出后需恢复
                       push cx                                                ;过程中使用,计数
                       push dx                                                ;过程中使用,端口号
                  
                       mov dx,0x1f2
                       mov al,1
                       out dx,al                     ;读取的扇区数

                       inc dx                        ;0x1f3
                       mov ax,si
                       out dx,al                     ;LBA地址7~0

                       inc dx                        ;0x1f4
                       mov al,ah
                       out dx,al                     ;LBA地址15~8

                       inc dx                        ;0x1f5
                       mov ax,di
                       out dx,al                     ;LBA地址23~16

                       inc dx                        ;0x1f6
                       mov al,0xe0                     ;LBA28模式,主盘
                       or al,ah                        ;LBA地址27~24
                       out dx,al

                       inc dx                        ;0x1f7
                       mov al,0x20                     ;读命令
                       out dx,al

          .waits:
                       in al,dx
                       and al,0b1000_1000                                ;BSY:1--硬盘忙,DRQ:1--准备好
                       cmp al,0x08
                       jnz .waits                      ;不忙,且硬盘已准备好数据传输
                                                                                        ;BSY:0--不忙,DRQ:1--准备好

                       mov cx,256                      ;总共要读取的字数,一个扇区
                       mov dx,0x1f0
          .readw:
                       in ax,dx
                       mov ,ax
                       add bx,2
                       loop .readw

                       pop dx
                       pop cx
                       pop bx
                       pop ax
                  
                       ret                       
                       
;--------------------------------------------------------------------------------
                        times 510-($-$$) db 0
                        db 0x55,0xaa
                       
                       

看不太懂你的,这是我们老师给的示例代码,但是这只读入一个扇区。

人造人 发表于 2021-11-24 21:50:11

15218524174 发表于 2021-11-24 21:34
;文件名:port_hd_hello.asm
                        ;功能:1.读取硬盘逻辑扇区号100处的1个扇区到物理内存0x10000处
                        ; ...

1. 我没有你的这个写代码环境,没办法调试你的程序,就像你没办法使用我写的程序一样
2. 也就是说还差一个写 hello world 到 101 扇区的程序?
硬盘读取命令是 0x20
写入命令是 0x30
其他基本一样

人造人 发表于 2021-11-24 21:50:44

#void read_sect(uint8_t *buf, size_t start_sect);
read_sect:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %edi

    # 读取1个扇区
    movb    $1, %al
    movl    $0x1f2, %edx
    outb    %al, %dx

    # 下面发送逻辑扇区号
    # 0~7
    movl    12(%ebp), %ecx
    movl    %ecx, %eax
    movl    $0x1f3, %edx
    outb    %al, %dx

    # 8~15
    movl    %ecx, %eax
    shrl    $8, %eax
    movl    $0x1f4, %edx
    outb    %al, %dx

    # 16~23
    movl    %ecx, %eax
    shrl    $16, %eax
    movl    $0x1f5, %edx
    outb    %al, %dx

    # LBA28模式, 主盘
    # LBA地址24~27
    movl    %ecx, %eax
    shrl    $24, %eax
    andl    $0x0f, %eax
    orl   $0xe0, %eax
    movl    $0x1f6, %edx
    outb    %al, %dx

    # 发送读命令
    movb    $0x20, %al
    movl    $0x1f7, %edx
    outb    %al, %dx

    # 等待硬盘准备好
.L1:
    inb   %dx, %al
    andb    $0x88, %al
    cmpb    $0x08, %al
    jne   .L1

    # 从硬盘读取数据
    movl    8(%ebp), %edi
    movl    $256, %ecx
    movl    $0x1f0, %edx
    cld
    rep   insw

    popl    %edi
    popl    %ebp
    retl

人造人 发表于 2021-11-24 21:51:17

#void write_sect(const uint8_t *buf, size_t start_sect);
write_sect:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %esi

    # 写入1个扇区
    movb    $1, %al
    movl    $0x1f2, %edx
    outb    %al, %dx

    # 下面发送逻辑扇区号
    # 0~7
    movl    12(%ebp), %ecx
    movl    %ecx, %eax
    movl    $0x1f3, %edx
    outb    %al, %dx

    # 8~15
    movl    %ecx, %eax
    shrl    $8, %eax
    movl    $0x1f4, %edx
    outb    %al, %dx

    # 16~23
    movl    %ecx, %eax
    shrl    $16, %eax
    movl    $0x1f5, %edx
    outb    %al, %dx

    # LBA28模式, 主盘
    # LBA地址24~27
    movl    %ecx, %eax
    shrl    $24, %eax
    andl    $0x0f, %eax
    orl   $0xe0, %eax
    movl    $0x1f6, %edx
    outb    %al, %dx

    # 发送写命令
    movb    $0x30, %al
    movl    $0x1f7, %edx
    outb    %al, %dx

    # 等待硬盘准备好
.L1:
    inb   %dx, %al
    andb    $0x88, %al
    cmpb    $0x08, %al
    jne   .L1

    # 把数据写入硬盘
    movl    8(%ebp), %esi
    movl    $256, %ecx
    movl    $0x1f0, %edx
    cld
    rep   outsw

    popl    %esi
    popl    %ebp
    retl
页: [1]
查看完整版本: 编写程序,读两个扇区,显示到屏幕Hello world