zoukankan      html  css  js  c++  java
  • [原]BIOS中断和nasm的输出形式

    int 10h 视频相关函数:
    AH      function
    00     设置video模式 
               附带调用寄存器           结果
              AL 模式                        None
    02        设置光标位置
               bh 页号,   dh行号   dl   列号
    13 写入串
    al  01 自动移动光标
    bl 属性
    es:bp 串指针
    cx字符计数
    dh初始行号
    dl初始列号
    bh页号

    nasm的输出格式:
    nasm可以选择许多输出文件格式。
    nasm选择的输出文件名字, 基于输入和格式。
    bin格式, 平面二进制, 不产生任何目标文件, 只产生写入的代码。这种纯粹的二进制文件被DOS使用:COM, 》SYS设备驱动都是纯粹的二进制文件。 纯二进制用于操作系统和加载程序开发。
    bin支持多个区域名字。使用bin使nasm模认为16位, 为了使用32位代码, 需要显式的使用BIT32指示符.

    bin文件提供额外的指示符ORG用于确定起始地址, 用于程序假设加载的位置.
    例如org 0x100
    dd label
    labe:
    不像masm中的ORG, 允许你跳到目标文件, 并且覆盖代码, nasm的org准确的说是ORGIN. 他唯一的功能是定位一个偏移, 加到内部地址上, 不保证任何技巧masm用有的.

    bin对段的扩展:
    bin扩展了SECTION指示符, 允许定位段的对齐需求, 通过在段定义结束使用ALIGN:
    section .data align=16
    ALIGN的参数定为了有多少区域低字节开始地址必须为零. 偏移之为2的幂.

    bin格式多区域支持:
    bin区域允许任何名字, 包括已知的.text .data .bss
    区域可以被指派分配的, 无分配. 默认是分配的, 但是bss段是无分配的.
    区域可以被在特定边界对齐, 在前面区域align=, 或者任意的start开始
    区域可以赋给虚拟起始地址, 用于计算内存引用. vstart =
    org, start, vstart, align的参数是关键表达式.
    任何在显式的SECTION之前的代码在默认的.text段中.
    ORG语句未给出, 默认为0
    .bss区域将会放在所有分配段的后面, 除非start, vstart, follows, vfollows被确定.
    所有段都对齐于4字节, 除非定义不同.
    区域可以重叠.
    nasm建立section..start为每个区域, 可以在代码中使用.
    映射文件可以通过-f bin生成, 通过map选项. 类型为 all, brief, sections, segments, symbols可以被确认. 输出可以定向到stdout, stderr, 或者文件. [map symbol myfile.map]没有用户表, 必须要方括号.

    nasm16位32位混合:
    最同用的混合大小的指令是用于操作系统: 以16位模式启动, 加载内核, 接着切换到保护模式, 跳转到32位内核开始地址. 在一个完全的32位操作系统, 这似乎是唯一的混合大小的指令, 因为在此之前所有的事都可被16位指令完成, 之后的事都可被32位指令完成.

    这个跳转指定了48位远地址, 因为目标段是32位. 然而, 必须在16位段中汇编, 不指定偏移大小, 将会被截断. nasm可以使用:
    jmp  dword  0x1234:0x56789abc
    dword前缀严格来讲应该紧跟冒号后面, 但是这样写是无歧义的, 该前缀强制偏移部分为长地址.

    你也可以作相反的操作:
    jmp  word  0x8756:0x4321
    指定了16位位模式.

    不同大小段间的寻址:
    最简单的在16位中寻址32位地址, 是采用寄存器, 因为任何包含在32位寄存器中的有效地址, 都强制32位寻址:
    mov eax , offset_into_32
    mov dword [fd:eax], 0x11223344
    这会工作, 但是有些笨重, 如果你已经知道精确的偏移, 允许使用32位有效地址.
    因此,只需要如此:
    mov   dword  [fd: dword offset] , 0x11223344
    nasm对于前缀在段前面还是后面并不关心, 因此更好看的是:
    mov  dword [dword fs: offset], 0x11223344
    不要被括号外dword迷惑, 用来控制存储目的地址数据大小, 里面的控制地址偏移的大小.

    也可以指定dword far 给远跳, 或者远调用.
    call dword far [fs: word 0x4321]
    加载48位远跳地址从16位偏移处, 16位段32位偏移, 调用该地址.





    作者:liyonghelpme 发表于2010/6/12 8:37:00 原文链接
    阅读:789 评论:0 查看评论
  • 相关阅读:
    Laravel 项目中编写第一个 Vue 组件
    laravel 中CSS 预编译语言 Sass 快速入门教程
    Laravel 项目中使用 Bootstrap 框架
    web框架之MVC/MTV
    jQuery补充之jQuery扩展/form表单提交/滚动菜单
    jQuery前端插件以及图片延迟加载
    JavaScript正则表达式补充
    jQuery语法介绍
    DOM
    JavaScript
  • 原文地址:https://www.cnblogs.com/liyonghelpme/p/4273546.html
Copyright © 2011-2022 走看看