[原]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位偏移, 调用该地址.
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.
映射文件可以通过-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 查看评论