第二章汇编
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Not Greater
jge
jngwenku.baidu.com
适用于有符号数比较,大于或等于则转移,SF=OF
适用于有符号数比较,不大于则转移,ZF=1或者SF≠OF
不大于等于
小于 小于等于 不小于等于 高于 高于等于 不高于 不高于等于 低于 低于等于 不低于 不低于等于 校验为偶
Not Greater or equal
Less Less or equal Not Less or equal Above Above or equal Not above Not Above or equal Below Below or equal Not below Not Below or equal Parity even
2.6 标志寄存器FLAGS
15 14 13 12 11 10 9 8 7 6 5 4 AF 3 2 PF 1 0 CF OF DF IF TF SF ZF
DF:方向标志; ZF:零标志; PF:奇偶标志位; CF:进位/借位标志; OF:溢出标志; AF:辅助进位标志; SF:符号标志; IF和TF:中断有关的标志。
2.3 汇编地址与标号
• 标号:在NASM汇编语言里,每条指令的前面都可以 拥有一个标号,以代表和指示该指令的汇编地址。因 为由程序员来计算和跟踪每条指令所在的汇编地址是 极其困难的。如: infi:jmp near infi infi是标号,标号可以由字母、数 字、”_”、”$”、”#”、”@”、”~”、”.”、”?”组成,但必须以 字母、”_”、”.”、”?”中的任何一个开头。 infi:jmp near infi可以写成: infi jmp near infi 或写成: infi: jmp near infi
校验为奇
Parity odd
jpo
校验为奇则转移,PF=0
2.9 其他指令
• cmp指令:在功能上和sub指令相同,仅仅根据 计算的结果设置相应的标志位,不保留计算结 果,不改变两个操作数的原有内容。OF、SF、 ZF、AF、CF和PF的状态依计算结果而定。 各种比较结果和相应的条件转移指令见上表。 • jcxz指令(jump if CX is zero):当CX寄存器的内 容为0时则转移。 • adc指令:带进位加法指令,adc指令在执行的时 候,将目的操作数和源操作数相加,还要加上 当前标志寄存器的CF位。用adc指令配合add指 令,就可以计算16位以上的加法。
jnge
jl jle jnle ja jae jna jnae jb jbe jnb jnbe jpe
适用于有符号数比较,不大于等于则转移,SF≠OF
适用于有符号数比较,小于等于则转移,等同于jnge,SF≠OF 适用于有符号数比较,小于等于则转移,等同于jng,ZF=1或者SF≠OF 适用于有符号数比较,不小于等于则转移,等同于jg,ZF=0且SF=OF 适用于无符号数比较,高于则转移,CF=0且ZF=0 适用于无符号数比较,高于等于则转移,CF=0 适用于无符号数比较,不高于则转移,CF=1或者ZF=1 适用于无符号数比较,不高于等于则转移,等同于jnae,CF=1 适用于无符号数比较,低于则转移,CF=1 适用于无符号数比较,低于等于则转移,等同于jna,CF=1或者ZF=1 适用于无符号数比较,不低于则转移,等同于jae,CF=0 适用于无符号数比较,不低于等于则转移,等同于ja,CF=0且ZF=0 校验为偶则转移,PF=1
2.4 声明并初始化数据
• 伪指令:是汇编指令的一种,它没有对应的 机器指令,所以不是机器指令的助记符。 • 使用伪指令DB、DW、DD、DQ来声明并初始 化数据。
DB:声明字节数据,跟在DB后面的操作数在当前占 一个字节。 DW:声明字数据,跟在DW后面的操作数在当前占 一个字(2个字节)。 DD:声明双字数据,跟在DD后面的操作数在当前占 一个双字(4个字节) 。 DQ:声明4字数据,跟在DQ后面的操作数在当前占 一个4字(8个字节) 。
2.7 另一些指令
• • • • • • • • • cld指令:方向标志位DF清0指令。 std指令:方向标志位DF置1指令。 rep指令前缀,CX不为0则重复。 loop 指令:如loop digit 将寄存器CX的内容减1,如果CX的内容不为0,转移 到指定的位置处执行,否则执行后面的指令。 inc指令与dec指令:目的操作数加1指令和目的操作数 减1指令。 neg指令:取反指令,用0减去指令中指定的操作数。 cbw(convert byte to word)指令:该指令不带操作数, 将寄存器AL中的有符号数扩展到整个AX。 cwd(convert word to double-word)指令:该指令不 带操作数,将寄存器AX中的有符号数扩展到DX:AX。 idiv指令:有符号除法指令。
2.5 一些指令
• xor 指令: xor 指令的目的操作数可以是通用寄存器和内存 单元,源操作数可以是通用寄存器、内存单元 和立即数(不允许两个操作数同时为内存单 元)。有8位xor,有16位xor。 • add 指令: add 指令的目的操作数可以是通用寄存器和内存 单元,源操作数可以是通用寄存器、内存单元 和立即数(不允许两个操作数同时为内存单 元)。
2.2 显卡和显存
• 在8086处理器的计算机系统中,可以访问1MB内 存,0x00000~0x9FFFF属于常规内存,由内存条提 供,0xF0000~0xFFFFF为ROM-BIOS。 • 中间的0xA0000~0xEFFFF这320KB空间,由特定的 外部设备来提供,其中就包括显卡。一直以来, 0xB8000~0xBFFFF这段物理地址空间是留给显卡的, 由显卡来使用,用来显示文本。 • 在文本模式下,屏幕上的每个字符对应着显存中 的连续两个字符,前一个是字符的ASCII码,后一 个是字符的显示属性,包括字符颜色(前景色) 和底色(背景色)。
• • •
2.9 条件转移指令
比较结果 等于 不等于 大于 英文描述 Equal Not equal Greater 指令 je jne jg ZF=1,相等则转移 ZF=0,不相等则转移 适用于有符号数比较,大于则转移,ZF=0且SF=OF 相关标志位的状态
大于等于
不大于
Greater or equal
2.2 显卡和显存
• 显卡的图形模式和字符模式。 图形模式下,显卡的分辨率:像素个数(如 1280×800),真彩色用3个字节表示一个像素的 颜色。 在所有个人计算机上使用的显卡,在加电自检之 后,都初始化为80×25的文本模式,在这种模式 下,屏幕上可以显示25行,每行80个字符,每屏 总共2000个字符。
第二章 编写主引导扇区代码
• • • • • • 了解8086处理器的通用寄存器 程序重定位问题 8086处理器的段寄存器 8086处理器的内存分段机制 汇编语言 Intel处理器的启动过程
2.1 硬盘基本知识
• 磁道、柱面、扇区;扇区编号一般为1~63; • 主引导扇区(Main Boot Sector, MBR):0面 0道1扇区; • 如果计算机的设置是从硬盘启动,那么ROMBIOS将读取硬盘主引导扇区的内容,将它加载 到内存地址0x0000:0x7c00处(即物理地址 0x07c00),然后用一个jmp指令跳到那里接着 执行:Jmp 0x0000:0x7c00 • 所以如果我们将编写的程序写入到主引导扇区, 我们的程序就不需要操作系统的支持就可以执 行。
2.1 硬盘基本知识
• 硬盘访问方法:CHS模式与LBA模式; LBA=C×磁头总数×每道扇区数┼H×每道扇区数 ┼(S―1) LBA是逻辑扇区号,C、H、S是物理扇区所在的磁 道、磁头和扇区号。
• 一个有效的主引导扇区,其最后两个字节应当是 0x55和0xAA,ROM-BIOS程序首先检测这两个标志, 如果主引导扇区有效,则以一个段间转移指令Jmp 0x0000:0x7c00跳到那里继续执行。
2.2 显卡和显存
• 在文本模式下,屏幕上的每个字符对应着显存中 的连续两个字符,前一个是字符的ASCII码,后一 个是字符的显示属性,包括字符颜色(前景色) 和底色(背景色)。下图是显示属性字节的各位 定义:
K R G B I R G B
背景色
前景色
2.2 显卡和显存
2.3 汇编地址与标号
• 汇编地址:在源程序的编译阶段,编译器会 把源程序整体上作为一个独立的段来处理, 并从0开始计算和跟踪每一条指令的地址。因 为该地址是在编译期间计算的,故称为汇编 地址。所以汇编地址是在源程序编译期间, 编译器为每条指令确定的汇编位置,指示该 指令相对于程序起始处或者段起始处的偏移 量,以字节计。当编译后的程序装入物理内 存后,它又是该指令在内存段内的偏移地址。
2.1 硬盘基本知识
• 一个有效的主引导扇区,其最后两个字节应当是 0x55和0xAA,ROM-BIOS程序首先检测这两个标志, 如果主引导扇区有效,则以一个段间转移指令Jmp 0x0000:0x7c00跳到那里继续执行。 • 一般来说,主引导扇区是由操作系统负责的。正 常情况下,一段精心编写的主引导扇区代码将检 测用来启动计算机的操作系统,并计算出它所在 的硬盘位置。然后,它把操作系统的自举代码加 载到内存,也用jmp指令跳转到那里继续执行,直 到操作系统完全启动。
2.8 指令对标志位的影响
• • • • • • • • • add:OF、SF、ZF、AF、CF和PF的状态依计算结果而定 cbw:不影响任何标志位 cld:DF=0。OF、SF、ZF、AF、CF和PF未定义。 cwd:不影响任何标志位 dec:CF标志不受影响,OF、SF、ZF、AF和PF的影响依计算结果 而定 div/idiv:对OF、SF、ZF、AF、CF和PF的影响未定义 inc:CF标志不受影响,OF、SF、ZF、AF和PF的影响依计算结果 而定 mov/movs:这类指令不影响任何标志位 neg:如果操作数为0,则CF=0,否则CF=1;OF、SF、ZF、AF和 PF的影响依计算结果而定 std:DF=1,不影响其他标志位 sub:OF、SF、ZF、AF、CF和PF的状态依计算结果而定 xor:OF=0,CF=0,SF、ZF和PF的状态依计算结果而定,对AF的 影响未定义。
•
2.5 一些指令
• 除法指令div: 16位被除数,8位除数:被除数必须在AX寄存器中, 除数可以由8位通用寄存器或内存单元提供。指令执 行后,商在寄存器AL中,余数在寄存器AH中,除数 不变。 如: div cl div byte [0x0023] 32位被除数,16位除数:被除数高16位在DX寄存器 中,低16位在AX寄存器中,除数可以由16位通用寄 存器或内存单元提供。指令执行后,商在寄存器AX 中,余数在寄存器DX中,除数不变。 如: div cx div word [0x0023]
2.5 一些指令
• jmp 指令: 绝对远转移:如jmp 0x5000:0xf0c0; 相对近转移:如jmp near infi • 伪指令times:重复它后面的指令若干次,如: times 203 db 0 • movsb和movsw指令: 将数据串从DS:SI传送到ES:DI,movsb以字节为单 位传送,movsw以字为单位传送。传送的字节数或者 字数由CX寄存器指定。每传送一次,CX的内容自动 减1。从内存的低地址端向高地址端传送为正向传送, 从内存的高地址端向低地址端传送为正反向传送。 标志寄存器FLAGS的方向标志位DF为0,则正向传送, 方向标志位DF为1,则反向传送。
2.5 一些指令
• mov指令:目的操作数是通用寄存器或内存单元;源 操作数是相同数据宽度的通用寄存器或内存单元。 如: mov ah, bh mov ax, dx mov [0x02], bh mov ax, [0x06] mov word [0x1c], 0xf0000 初始化段寄存器: mov 段寄存器,通用寄存器 mov 段寄存器,内存单元
jge
jngwenku.baidu.com
适用于有符号数比较,大于或等于则转移,SF=OF
适用于有符号数比较,不大于则转移,ZF=1或者SF≠OF
不大于等于
小于 小于等于 不小于等于 高于 高于等于 不高于 不高于等于 低于 低于等于 不低于 不低于等于 校验为偶
Not Greater or equal
Less Less or equal Not Less or equal Above Above or equal Not above Not Above or equal Below Below or equal Not below Not Below or equal Parity even
2.6 标志寄存器FLAGS
15 14 13 12 11 10 9 8 7 6 5 4 AF 3 2 PF 1 0 CF OF DF IF TF SF ZF
DF:方向标志; ZF:零标志; PF:奇偶标志位; CF:进位/借位标志; OF:溢出标志; AF:辅助进位标志; SF:符号标志; IF和TF:中断有关的标志。
2.3 汇编地址与标号
• 标号:在NASM汇编语言里,每条指令的前面都可以 拥有一个标号,以代表和指示该指令的汇编地址。因 为由程序员来计算和跟踪每条指令所在的汇编地址是 极其困难的。如: infi:jmp near infi infi是标号,标号可以由字母、数 字、”_”、”$”、”#”、”@”、”~”、”.”、”?”组成,但必须以 字母、”_”、”.”、”?”中的任何一个开头。 infi:jmp near infi可以写成: infi jmp near infi 或写成: infi: jmp near infi
校验为奇
Parity odd
jpo
校验为奇则转移,PF=0
2.9 其他指令
• cmp指令:在功能上和sub指令相同,仅仅根据 计算的结果设置相应的标志位,不保留计算结 果,不改变两个操作数的原有内容。OF、SF、 ZF、AF、CF和PF的状态依计算结果而定。 各种比较结果和相应的条件转移指令见上表。 • jcxz指令(jump if CX is zero):当CX寄存器的内 容为0时则转移。 • adc指令:带进位加法指令,adc指令在执行的时 候,将目的操作数和源操作数相加,还要加上 当前标志寄存器的CF位。用adc指令配合add指 令,就可以计算16位以上的加法。
jnge
jl jle jnle ja jae jna jnae jb jbe jnb jnbe jpe
适用于有符号数比较,不大于等于则转移,SF≠OF
适用于有符号数比较,小于等于则转移,等同于jnge,SF≠OF 适用于有符号数比较,小于等于则转移,等同于jng,ZF=1或者SF≠OF 适用于有符号数比较,不小于等于则转移,等同于jg,ZF=0且SF=OF 适用于无符号数比较,高于则转移,CF=0且ZF=0 适用于无符号数比较,高于等于则转移,CF=0 适用于无符号数比较,不高于则转移,CF=1或者ZF=1 适用于无符号数比较,不高于等于则转移,等同于jnae,CF=1 适用于无符号数比较,低于则转移,CF=1 适用于无符号数比较,低于等于则转移,等同于jna,CF=1或者ZF=1 适用于无符号数比较,不低于则转移,等同于jae,CF=0 适用于无符号数比较,不低于等于则转移,等同于ja,CF=0且ZF=0 校验为偶则转移,PF=1
2.4 声明并初始化数据
• 伪指令:是汇编指令的一种,它没有对应的 机器指令,所以不是机器指令的助记符。 • 使用伪指令DB、DW、DD、DQ来声明并初始 化数据。
DB:声明字节数据,跟在DB后面的操作数在当前占 一个字节。 DW:声明字数据,跟在DW后面的操作数在当前占 一个字(2个字节)。 DD:声明双字数据,跟在DD后面的操作数在当前占 一个双字(4个字节) 。 DQ:声明4字数据,跟在DQ后面的操作数在当前占 一个4字(8个字节) 。
2.7 另一些指令
• • • • • • • • • cld指令:方向标志位DF清0指令。 std指令:方向标志位DF置1指令。 rep指令前缀,CX不为0则重复。 loop 指令:如loop digit 将寄存器CX的内容减1,如果CX的内容不为0,转移 到指定的位置处执行,否则执行后面的指令。 inc指令与dec指令:目的操作数加1指令和目的操作数 减1指令。 neg指令:取反指令,用0减去指令中指定的操作数。 cbw(convert byte to word)指令:该指令不带操作数, 将寄存器AL中的有符号数扩展到整个AX。 cwd(convert word to double-word)指令:该指令不 带操作数,将寄存器AX中的有符号数扩展到DX:AX。 idiv指令:有符号除法指令。
2.5 一些指令
• xor 指令: xor 指令的目的操作数可以是通用寄存器和内存 单元,源操作数可以是通用寄存器、内存单元 和立即数(不允许两个操作数同时为内存单 元)。有8位xor,有16位xor。 • add 指令: add 指令的目的操作数可以是通用寄存器和内存 单元,源操作数可以是通用寄存器、内存单元 和立即数(不允许两个操作数同时为内存单 元)。
2.2 显卡和显存
• 在8086处理器的计算机系统中,可以访问1MB内 存,0x00000~0x9FFFF属于常规内存,由内存条提 供,0xF0000~0xFFFFF为ROM-BIOS。 • 中间的0xA0000~0xEFFFF这320KB空间,由特定的 外部设备来提供,其中就包括显卡。一直以来, 0xB8000~0xBFFFF这段物理地址空间是留给显卡的, 由显卡来使用,用来显示文本。 • 在文本模式下,屏幕上的每个字符对应着显存中 的连续两个字符,前一个是字符的ASCII码,后一 个是字符的显示属性,包括字符颜色(前景色) 和底色(背景色)。
• • •
2.9 条件转移指令
比较结果 等于 不等于 大于 英文描述 Equal Not equal Greater 指令 je jne jg ZF=1,相等则转移 ZF=0,不相等则转移 适用于有符号数比较,大于则转移,ZF=0且SF=OF 相关标志位的状态
大于等于
不大于
Greater or equal
2.2 显卡和显存
• 显卡的图形模式和字符模式。 图形模式下,显卡的分辨率:像素个数(如 1280×800),真彩色用3个字节表示一个像素的 颜色。 在所有个人计算机上使用的显卡,在加电自检之 后,都初始化为80×25的文本模式,在这种模式 下,屏幕上可以显示25行,每行80个字符,每屏 总共2000个字符。
第二章 编写主引导扇区代码
• • • • • • 了解8086处理器的通用寄存器 程序重定位问题 8086处理器的段寄存器 8086处理器的内存分段机制 汇编语言 Intel处理器的启动过程
2.1 硬盘基本知识
• 磁道、柱面、扇区;扇区编号一般为1~63; • 主引导扇区(Main Boot Sector, MBR):0面 0道1扇区; • 如果计算机的设置是从硬盘启动,那么ROMBIOS将读取硬盘主引导扇区的内容,将它加载 到内存地址0x0000:0x7c00处(即物理地址 0x07c00),然后用一个jmp指令跳到那里接着 执行:Jmp 0x0000:0x7c00 • 所以如果我们将编写的程序写入到主引导扇区, 我们的程序就不需要操作系统的支持就可以执 行。
2.1 硬盘基本知识
• 硬盘访问方法:CHS模式与LBA模式; LBA=C×磁头总数×每道扇区数┼H×每道扇区数 ┼(S―1) LBA是逻辑扇区号,C、H、S是物理扇区所在的磁 道、磁头和扇区号。
• 一个有效的主引导扇区,其最后两个字节应当是 0x55和0xAA,ROM-BIOS程序首先检测这两个标志, 如果主引导扇区有效,则以一个段间转移指令Jmp 0x0000:0x7c00跳到那里继续执行。
2.2 显卡和显存
• 在文本模式下,屏幕上的每个字符对应着显存中 的连续两个字符,前一个是字符的ASCII码,后一 个是字符的显示属性,包括字符颜色(前景色) 和底色(背景色)。下图是显示属性字节的各位 定义:
K R G B I R G B
背景色
前景色
2.2 显卡和显存
2.3 汇编地址与标号
• 汇编地址:在源程序的编译阶段,编译器会 把源程序整体上作为一个独立的段来处理, 并从0开始计算和跟踪每一条指令的地址。因 为该地址是在编译期间计算的,故称为汇编 地址。所以汇编地址是在源程序编译期间, 编译器为每条指令确定的汇编位置,指示该 指令相对于程序起始处或者段起始处的偏移 量,以字节计。当编译后的程序装入物理内 存后,它又是该指令在内存段内的偏移地址。
2.1 硬盘基本知识
• 一个有效的主引导扇区,其最后两个字节应当是 0x55和0xAA,ROM-BIOS程序首先检测这两个标志, 如果主引导扇区有效,则以一个段间转移指令Jmp 0x0000:0x7c00跳到那里继续执行。 • 一般来说,主引导扇区是由操作系统负责的。正 常情况下,一段精心编写的主引导扇区代码将检 测用来启动计算机的操作系统,并计算出它所在 的硬盘位置。然后,它把操作系统的自举代码加 载到内存,也用jmp指令跳转到那里继续执行,直 到操作系统完全启动。
2.8 指令对标志位的影响
• • • • • • • • • add:OF、SF、ZF、AF、CF和PF的状态依计算结果而定 cbw:不影响任何标志位 cld:DF=0。OF、SF、ZF、AF、CF和PF未定义。 cwd:不影响任何标志位 dec:CF标志不受影响,OF、SF、ZF、AF和PF的影响依计算结果 而定 div/idiv:对OF、SF、ZF、AF、CF和PF的影响未定义 inc:CF标志不受影响,OF、SF、ZF、AF和PF的影响依计算结果 而定 mov/movs:这类指令不影响任何标志位 neg:如果操作数为0,则CF=0,否则CF=1;OF、SF、ZF、AF和 PF的影响依计算结果而定 std:DF=1,不影响其他标志位 sub:OF、SF、ZF、AF、CF和PF的状态依计算结果而定 xor:OF=0,CF=0,SF、ZF和PF的状态依计算结果而定,对AF的 影响未定义。
•
2.5 一些指令
• 除法指令div: 16位被除数,8位除数:被除数必须在AX寄存器中, 除数可以由8位通用寄存器或内存单元提供。指令执 行后,商在寄存器AL中,余数在寄存器AH中,除数 不变。 如: div cl div byte [0x0023] 32位被除数,16位除数:被除数高16位在DX寄存器 中,低16位在AX寄存器中,除数可以由16位通用寄 存器或内存单元提供。指令执行后,商在寄存器AX 中,余数在寄存器DX中,除数不变。 如: div cx div word [0x0023]
2.5 一些指令
• jmp 指令: 绝对远转移:如jmp 0x5000:0xf0c0; 相对近转移:如jmp near infi • 伪指令times:重复它后面的指令若干次,如: times 203 db 0 • movsb和movsw指令: 将数据串从DS:SI传送到ES:DI,movsb以字节为单 位传送,movsw以字为单位传送。传送的字节数或者 字数由CX寄存器指定。每传送一次,CX的内容自动 减1。从内存的低地址端向高地址端传送为正向传送, 从内存的高地址端向低地址端传送为正反向传送。 标志寄存器FLAGS的方向标志位DF为0,则正向传送, 方向标志位DF为1,则反向传送。
2.5 一些指令
• mov指令:目的操作数是通用寄存器或内存单元;源 操作数是相同数据宽度的通用寄存器或内存单元。 如: mov ah, bh mov ax, dx mov [0x02], bh mov ax, [0x06] mov word [0x1c], 0xf0000 初始化段寄存器: mov 段寄存器,通用寄存器 mov 段寄存器,内存单元