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 查看评论
  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/liyonghelpme/p/4273546.html
Copyright © 2011-2022 走看看