汇编语言期末复习

该博客围绕汇编语言展开,介绍了CPU基本功能、常用ASCII码等基础知识,阐述IA - 32处理器的工作方式、通用寄存器、各类指令等。还涉及程序设计初步、字符串操作、VC目标代码优化、汇编语言执行环境等内容,最后分析了主引导记录和程序加载器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第一章 基础知识

1.CPU的基本功能:

2.常用ASCII码:

3.基本数据类型:

4.数据存储

第二章 IA-32处理器基本功能

1.保护方式和实地址方式

2.通用寄存器

3.数据传送指令

4.算数运算指令

5.标志寄存器

6.状态标志操作指令

7.段寄存器

7.1逻辑地址

7.2段寄存器

8.寻址方式

9.取有效地址指令:LEA

10.指令指针寄存器

11.转移指令

12.堆栈

第三章 程序设计初步

1.参数传递

2.局部变量

3.逻辑运算指令

4.移位指令

5.保护寄存器

第四章 字符串操作

1.字符串操作指令

2.重复操作前缀

3.方向标志DF

4.位操作指令

5.条件设置字节指令

第五章 VC目标代码的阅读理解

目标程序的优化

1.使大小最小化

2.使速度最大化

第六章 汇编语言

1.实地址执行环境

2.段寄存器引用

3. 16位的存储器寻址方式

4.调用系统功能

5.操作数表示

6.伪指令语句和变量

7.段声明和段间转移

8.段间过程调用和返回

9.目标文件和段模式

第七章 BIOS和虚拟机

主引导记录(MBR)分析

程序加载器


第一章 基础知识

1.CPU的基本功能:

        执行机器指令、暂存少量数据、访问存储器。

(1)机器指令:数据传送指令、算术逻辑运算指令、控制指令(转移指令、处理器控制指令)和其他指令。

(2)CPU内部有若干寄存器,可以用于存放运算数据和运算结果。处理寄存器中的数据要比处理存储器中的数据快得多。

(3)存储器是指CPU能直接访问的计算机系统的物理内存。

2.常用ASCII码:

        0:30H,A:41H,Z:5AH,a:61H,z:7AH

        十进制数字的编码就是对应十进制数字值加上30H;对应大小写字母的编码相差20H。

3.基本数据类型:

        字节、字(2个字节)、双字(4个字节)、四字、十字节、字符串

4.数据存储

    #include  <stdio.h>
    char  buff[] = { 3, 2, 1, 0, 130 };     // 130=0x82
    int  a, b;
    int  main( )
    {
        char  *p = buff;
        //
        a = *( int* ) p;                   //L1
        b = *( int* ) ( p+1 );             //L2
        //
        printf( "a = %x, b=%x\n", a, b );  //L3
        printf( "a = %d, b=%d\n", a, b );  //L4
        return  0;
    }

   c语言各种进制整数输出格式

分析如下:

根据小端方式的“高高低低”原则,a=00010203H,b=82000102H

运行结果:

举例:

运行结果:%xh:16进制输出,末尾带h

第二章 IA-32处理器基本功能

IA-32系列CPU有3种工作方式:保护方式、实地址方式、系统管理方式;还有一种子工作方式,即虚拟8086方式。

1.保护方式和实地址方式

(1)保护方式:常态工作方式,能发挥全部性能和特点。

        保护方式下,全部32位地址线有效,可寻址高达4GB的物理地址空间。

        保护方式下,支持分页和分段。用于指定存储单元的线性地址可以不是真实的物理地址,而是面向虚拟存储器的虚拟地址。

(2)实地址方式:最初的工作方式。

        实地址方式下,只有20位地址线,只能访问最低端的1MB的物理地址空间。

        实地址方式下,只支持存储器分段,而且每个存储段的大小限于64KB。

        实地址对应保护方式下的虚地址。

2.通用寄存器

8个32位通用寄存器:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI。

这8个32位通用寄存器的低16位相当于8个16位的通用寄存器,可以单独存取它们:AX,BX,CX,DX,SP,BP,SI,DI。

4个16位通用寄存器AX,BX,CX,DX还可分解成8个独立的8位寄存器。例如:AH寄存器是AX寄存器的高8位,AL寄存器是AX寄存器的低8位,AH和AL寄存器合并就是AX寄存器。

注意:另外4个16位通用寄存器SP,BP,SI,DI不能分解为8位寄存器。

专门用途和命名:

(1)AX和AL寄存器又称累加器(Accumulator)。

(2)BX寄存器被称为基(Base)地址寄存器,可作为存储器指针使用。

(3)CX寄存器被称为计数(Counter)寄存器,在字符串操作和循环操作时,用它来控制循环次数,在移位操作时,CL寄存器用于保存移位的次数。

(4)DX寄存器称为数据(Data)寄存器。

(5)SI和DI称为变址寄存器,在字符串操作中,规定由SI给出源指针,DI给出目的指针,所以Si也称为源变址(Source Index)寄存器,DI也称为目的变址(Destination Index)寄存器。

(6)BP和SP称为指针寄存器,BP也称为基(Base Pointer)指针,SP只作为堆栈指针(Stack Pointer)使用。

3.数据传送指令

(1)普通传送指令MOV:两个操作数尺寸必须一致

通用寄存器<——通用寄存器、存储单元<——通用寄存器、通用寄存器<——存储单元、通用寄存器<——立即数

(2)交换指令XCHG:不能有立即数

通用寄存器<——>通用寄存器、存储单元<——>通用寄存器

(3)进栈和出栈指令PUSH和POP:至少是一个字(16位)

PUSH:32位通用寄存器、16位通用寄存器、段寄存器、双字存储单元、字存储单元、立即数

POP:32位通用寄存器、16位通用寄存器、段寄存器、双字存储单元、字存储单元

POP的操作数不能是立即数,也不能是代码段寄存器CS

16位通用寄存器全入栈指令PUSHA和全出栈指令POPA,压入顺序AX,CX,DX,BX,SP,BP,SI,DI。但SP的值不是由堆栈弹出的,而是通过增加16来恢复。

32位通用寄存器全入栈指令PUSHAD和全出栈指令POPAD,压入顺序EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。但ESP的值不是由堆栈弹出的,而是通过增加32来恢复。

(4)符号扩展指令CBW,CWD,CDQ,CWDE:对于无符号将高位清0即可。

字节转换为字CBW:AL符号扩展到AH

字转换为双字CWD:AX符号扩展到DX;这条指令能在两个操作数相除之前,产生一个双字长度的被除数。

双字转换为四字CDQ:EAX符号扩展到EDX

字转换为双字CWDE:AX符号扩展到寄存器EAX的高16位

(5)扩展传送指令MOVSX和MOVZX:目的操作数必须大于源操作数尺寸

符号扩展传送指令MOVSX        DEST,SRC

DEST(通用寄存器)<——SRC(通用寄存器、存储单元)

零扩展传送指令MOVZX        DEST,SRC

DEST(通用寄存器)<——SRC(通用寄存器、存储单元)

4.算数运算指令

(1)加运算指令ADD和ADC:影响标志寄存器,两个操作数尺寸必须一致

ADD:DEST(通用寄存器、存储单元)<——DEST + SRC(通用寄存器、存储单元、立即数)

ADC:DEST(通用寄存器、存储单元)<——DEST + SRC(通用寄存器、存储单元、立即数)+CF

(2)减运算指令SUB和SBB:影响标志寄存器,两个操作数尺寸必须一致

SUB:DEST(通用寄存器、存储单元)<——DEST - SRC(通用寄存器、存储单元、立即数)

SBBDEST(通用寄存器、存储单元)<——DEST - SRC-CF(通用寄存器、存储单元、立即数)

(3)乘运算指令MUL和IMUL

无符号:MUL        OPRD       另一个操作数隐含,位于AL、AX、EAX中

OPRD为字节操作数(8位),则AL*OPRD结果送到AX

OPRD为字操作数(16位),则AX*OPRD结果送到EAX

OPRD为双字操作数(32位),则EAX*OPRD结果送到EDX:EAX中

有符号:

IMUL        OPRD(通用寄存器、存储单元) : 另一个操作数隐含,位于AL、AX、EAX中,两者均为有符号

IMUL        DEST,SRC:DEST(16位或32位通用寄存器)<——DEST * SRC(通用寄存器、存储单元、立即数)

IMUL        DEST,SRC1,SRC2:DEST(16位或32位通用寄存器)<——SRC1(通用寄存器、存储单元)* SRC2(立即数)

(4)除运算指令DIV和IDIV

无符号:DIV        OPRD(通用寄存器、存储单元):另一个操作数隐含,位于AX、DX:AX、EDX:EAX中(DX含有被除数的高16位,EDX含有被除数的高32位)。

OPRD为字节操作数(8位),AX/OPRD商送到AL,余数送到AH

OPRD为字操作数(16位),DX:AX/OPRD商送到AX,余数送到DX

OPRD为双字操作数(32位),EDX:EAX/OPRD商送到EAX,余数送到EDX

        余数在高位,商在低位。

有符号:IDIV        OPRD:另一个操作数隐含,位于AX、DX:AX、EDX:EAX中(DX含有被除数的高16位,EDX含有被除数的高32位)。

(5)加1和减1运算指令INC和DEC:不影响进位(CF)标志,影响其他标志。

        INC  通用寄存器、存储单元

        DEC 通用寄存器、存储单元

(6)取负数指令NEG:影响标志寄存器:操作数为0,CF=0,否则CF=1。

        NEG  通用寄存器、存储单元

(7)比较指令CMP:根据DEST-SRC的差来影响标志寄存器

        除了不把结果送到DEST外,这条指令和SUB一样。

5.标志寄存器

(1)进位标志CF:如果运算结果的最高位产生一个借位或进位,CF=1。

        比较无符号数的大小、进行多字节加减运算时,使用到CF,移位指令能够把操作数的最高位或最低位移入CF。

(2)零标志ZF:运算结果为0,ZF=1。

        有符号和无符号都使用。

(3)符号标志SF:运算结果(为负)最高位为1,SF=1。

(4)溢出标志OF:有符号数加减运算是否溢出,溢出则OF=1。

        运算结果超过8位、16位、32位有符号数表示范围,称为溢出。

在判断有符号数的大小时,会用到OF和SF;在判断无符号数大小时,则会使用到CF。

(5)奇偶标志PF:运算结果的最低字节中含有“1”的位数是奇数还是偶数。偶数PF=1。

(6)辅助进位标志AF:算术运算中第3位是否产生进位或借位,或者最低的4位是否有进位或借位。有AF=1。

6.状态标志操作指令

(1)进位CF标志操作

        清进位标志CLC:CF=0

        置进位标志STC:CF=1

        进位标志取反CMC

(2)获取状态标志操作指令LAHF:把标志寄存器的低8位送到寄存器AH中。

(3)设置状态标志操作指令SAHF:把AH送到标志寄存器的低8位,使得SF、ZF、AF、PF、CF成为AH对应位的值,但保留位(位1、位3、位5)不受影响。

7.段寄存器

7.1逻辑地址

在程序中用于表示存储单元的地址称为逻辑地址。逻辑地址是二维的,第一维表示某段,第二维表示段内某单元。

二维逻辑地址:段号(实地址:段值;保护方式:段选择子):段内地址(段内偏移/偏移/有效地址)

物理地址=段内起始地址+偏移

可以简单认为,在保护方式下,物理地址32位,段起始地址32位,偏移32位

                        在实地址方式下,物理地址20位,段起始地址20位,偏移16位

7.2段寄存器

逻辑地址中的段号(实地址:段值;保护方式:段选择子)存放在段寄存器中。

代码段寄存器CS:指定当前代码段

堆栈段寄存器SS:指定当前堆栈段

数据段寄存器DS:默认指定当前数据段,特殊默认将引用SS

附加段寄存器ES,从Intel 80386处理器开始,增加了2个附加段寄存器FS、GS:用于指定数据段。

这6个段寄存器的可见部分的长度都是16位,存放16位的段号(实地址:段值;保护方式:段选择子)。

代码段寄存器CS不能作为目标,不能把立即数直接传送到段寄存器。

8.寻址方式

(1)立即寻址方式:操作数本身包含在指令中,直接作为指令的一部分给出。SUB  CL,2

(2)寄存器寻址方式:操作数在CPU内部的寄存器中,指令中指定寄存器。MOV  EBP,ESP

(3)32位存储器寻址方式:

        直接寻址方式:操作数在存储器中,指令直接包含操作数所在存储单元的有效地址。

                MOV ECX,[95480H]

        寄存器间接寻址方式:操作数在存储器中,由8个32位的通用寄存器之一给出操作数所在存储单元的有效地址。

                MOV  EAX,[ESI]

除ESP外,7个通用寄存器都可以作为变址寄存器。

基址、变址、位移量,可省去任意2部分。

9.取有效地址指令:LEA

        不影响各标志位

        16位或32位通用寄存器<——(存储器操作数)有效地址

1)源操作数的有效地址采用32位存储器寻址,而目的操作数是16位通用寄存器,那么只把有效地址的低16位送到16位通用寄存器。

2)源操作数的有效地址采用16位存储器寻址,而目的操作数是32位通用寄存器,那么把有效地址无符号扩展成32位,并送到32位通用寄存器。

10.指令指针寄存器

        32位EIP、16位IP

CS和EIP确定所取指令的存储单元地址。代码段寄存器CS给出当前代码段的段号,指令指针寄存器EIP给出偏移。

在实方式下,由于段的最大范围是64KB,因此EIP的高16位必须是0。

在取出一条指令后,会根据所取指令的长度,自动调整指令指针寄存器EIP的值,使其指向下一条指令,实现顺序执行指令。

11.转移指令

        改变指令指针寄存器EIP的值,引起转移。

(1)条件转移指令Jcc  label

在条件满足的情况下,只改变EIP。也就是说,条件转移的目的地仅限于同一个代码段,这种不改变CS,仅改变EIP的转移称为段内转移

(2)无条件转移指令JMP label

(3)循环指令

                1)计数循环指令LOOP        label

                        使ECX-1,如果结果≠0,转移到label;通常在使用时先要设置ECX的初值,即循环次数。

                2)等于/全零循环指令LOOPE/LOOPZ        label

                        使ECX-1,如果结果≠0,并且ZF=1(表示相等/为0),转移到label

                3)不等于/非全零循环指令LOOPNE/LOOPNZ

                        使ECX-1,如果结果≠0,并且ZF=0(表示不相等/不为0),转移到label

                4)计数器循环指令JECXZ        label

                        当ECX=0转移到label

(4)过程调用指令CALL label

        具体操作:①把返回地址偏移压入堆栈(紧随过程调用指令的下一条指令的有效地址)

                          ②使得EIP的内容为目标地址偏移(子程序开始处),从而实现转移

        与JMP相比,CALL只是多了一步:保存返回地址。

(5)过程返回指令

       RET 该指令从堆栈中弹出返回地址(送到指令指针寄存器EIP中),并转移到所弹出的地址。

       RET        count带立即数返回指令,count是一个16位立即数。先弹出返回地址偏移(调整ESP),再把count加到ESP上(可以用于撤销主程序调用时压入堆栈的参数)。

12.堆栈

栈底:地址大        栈顶:地址小

        堆栈段寄存器SS含有当前堆栈段的段号(SS指示堆栈所在内存区域的位置);堆栈指针寄存器ESP含有栈顶的偏移(有效地址),ESP指向栈顶。随着进栈操作,ESP减小。

堆栈的用途:1)保护寄存器内容或者保护现场 2)保存返回地址 3)传递参数 4)安排局部变量或者临时变量

第三章 程序设计初步

1.参数传递

        多种传递参数的方法:寄存器传递法、堆栈传递法、约定内存单元传递法和CALL后续区传递法等。

(1)寄存器传递法:入口参数:ECX、EDX        出口参数:EAX

int _fastcall cf214(int x,int y)        ECX:x(入口参数1)、EDX:y(入口参数2)

(2)堆栈传递法:主程序调用子程序之前,需要把传递的参数(从右往左)依次压入堆栈,然后子程序从堆栈中取入口参数。不占用寄存器,无需使用额外的存储单元。

示例:

cf35    PROC            ;表示过程(函数)开始
    push    ebp
    mov     ebp,esp            ;建立堆栈框架
    mov     eax,DWORD PTR[ebp+8]
    mov     ecx,DWORD PTR[ebp+12]
    cmp     eax,ecx
    jge     SHORT In1cf35
    mov     eax,ecx            ;由eax传递返回值
In1cf35:
    pop    ebp                ;撤销堆栈框架
    ret                        ;返回
cf35    end                    ;表示过程(函数)结束

2.局部变量

3.逻辑运算指令

(1)逻辑与运算指令AND        DEST,SRC

       某个操作数与自己相“与”,其值不变,但CF=0,OF=0

(2)逻辑或运算指令OR         DEST,SRC

       某个操作数与自己相“或”,其值不变,但CF=0,OF=0

(3)逻辑异或运算指令XOR         DEST,SRC        对应位相同为0,不同为1

         某个操作数与自己相“异或”,实现清零;与全1“异或”实现取反,与全0“异或”保持原位

(4)逻辑否运算指令NOT        OPRD

        按位取反,然后送回OPRD

(5)按位测试指令TEST,与AND类似CF=0,OF=0,结果不送到DEST,影响状态标志

4.移位指令

移位指令要标明移动的位数,可以是一个8位的立即数,或者是寄存器CL。

(1)算数右移指令SAR、逻辑右移指令SHR、算数或逻辑左移指令SAL/SHL

算数右移指令SAR:把操作数OPRD右移count位,移出的最低位进入标志位CF,左边补符号位

逻辑右移指令SHR:把操作数OPRD右移count位,移出的最低位进入标志位CF,左边补0

算数或逻辑左移指令SAL/SHL:把操作数OPRD左移count位,移出的最高位进入标志位CF,右边补0

(2)循环右移指令ROR、循环左移指令ROL

        把操作数OPRD循环左/右移count位,移出的最高/低位进入标志位CF也进入最低/高位。

(3)带进位右移指令RCR、带进位左移指令RCL

        把操作数OPRD连同CF循环左/右移count位,移出的最高/低位进入标志位CF,CF进入最低/高位。

(4)双精度左移指令SHLD、双精度右移指令SHRD

        SHLD/SHRD        OPRD1,OPRD2,count

        把目的操作数OPRD1左/右移指定的count位,在低/高端空出的位用操作数OPRD2高/低端的count位填补,操作数OPRD2保持不变。操作数OPRD1最后移出的位保留在CF中。

5.保护寄存器

函数代码使用寄存器EAX,ECX,EDX,但并不事先保护它们,函数代码只要使用了寄存器EBX,ESI,EDI,EBP,总是先保护它们,过后再恢复。

第四章 字符串操作

        在涉及源操作数时,默认引用数据段寄存器DS,在涉及目的操作数时,默认引用附加段寄存器ES。因此,DS:ESI指向源串,ES:EDI指向目的串。如果只有一个数据段或者目的串与源串在同一个段(ES=DS),ESI指向源串,EDI指向目的串

1.字符串操作指令

每种串操作指令包括3条具体指令,分别对应3种字符尺寸,即字节、字、双字。

(1)装入字符指令LODSB、LODSW、LODSD

把寄存器ESI指向的一个字节/字/双字数据装入累加器AL/AX/EAX中,然后根据DF使ESI加减1/2/4

(2)存储字符指令STOSB、STOSW、STOSD

把累加器AL/AX/EAX中的数据送到EDI所指向的存储单元中,然后根据DF使EDI加减1/2/4

(3)传送字符指令MOVSB、MOVSW、MOVSD

把寄存器ESI指向的一个字节/字/双字数据送到EDI所指向的存储单元中,然后根据DF使ESI和EDI分别加减1/2/4

(4)扫描字符指令SCACB、SCASW、SCASD

把累加器AL/AX/EAX中的内容与EDI所指向的存储单元采用相减方式比较,影响状态标志但不影响两个操作数,然后根据DF使EDI加减1/2/4。

(5)比较字符指令CMPSB、CMPSW、CMPSD

把寄存器ESI指向的一个字节/字/双字数据与EDI所指向的存储单元采用相减方式比较,影响状态标志但不影响两个操作数,然后根据DF使ESI和EDI分别加减1/2/4。

2.重复操作前缀

(1)REP:先判断ECX是否为0,为0就结束重复,否则ECX-1,重复其后的串操作指令。

(2)REPE/REPZ:每重复一次,ECX-1,直到ECX=0或者串操作指令使ZF=0时为止。只有当ZF=1时(相等/为0)才有可能继续重复。

(3)REPNE/REPNZ:每重复一次,ECX-1,直到ECX=0或者串操作指令使ZF=1时为止。只有当ZF=0时(不相等/不为0)才有可能继续重复。

3.方向标志DF

DF=0(复位)时,操作方向从低到高,按递增方式调整ESI和EDI的值;DF=1(置位)时,操作方向从高到低,按递减方式调整ESI和EDI的值。

(1)清方向标志DF:CLD

(2)设置方向标志DF:STD

4.位操作指令

        位串的起始位号是0.

                操作指令        OPRD1,OPRD2  :OPRD1指定位串,OPRD2指定位号

(1)位测试指令BT:把被测试位的值送到CF

(2)位测试及复位指令BTR:把被测试位的值送到CF,并且把被测试位置0

(3)位测试及置位指令BTS:把被测试位的值送到CF,并且把被测试位置1

(4)位测试及取反指令BSC:把被测试位的值送到CF,并且把被测试取反

(5)位反向扫描指令BSR:从左往右扫描OPRD2中第一个含“1”的位,把该位号送至OPRD1

(6)位顺向扫描指令BSF:从右往左扫描OPRD2中第一个含“1”的位,把该位号送至OPRD1

5.条件设置字节指令

SETcc        OPRD(8位寄存器、字节存储单元)

条件满足时,将OPRD设置为1

第五章 VC目标代码的阅读理解

目标程序的优化

1.使大小最小化

(1)采用寄存器作为变量

(2)采用长度较短的指令或者指令片段

2.使速度最大化

(1)指令执行时间:减少对存储器的访问,能够提高执行效率

(2)避免时钟过多的指令:避免使用除法指令

(3)减少转移指令:由于转移可能导致执行指令的流水线冲洗,也可能引起指令的高速缓存未命中,于是增加指令的时钟数。

(4)减少循环执行次数

(5)内联函数:在源程序中以函数的形式存在,但在目标程序中直接嵌入。

第六章 汇编语言

1.实地址执行环境

可以使用8个16位通用寄存器和对应32位寄存器、6个段寄存器(CS含有当前代码段段值,DS含有当前数据段段值,SS含有当前堆栈段段值)

实方式下EIP的高16位必须为0,ESP的高16位必须为0,相当于只有低16位的IP和SP起作用。

实地址方式下,只有20位地址线,只能访问最低端的1MB的物理地址空间。支持存储器分段,而且每个存储段的大小限于64KB,逻辑段的起始地址必须是16的倍数。

物理地址20位,段起始地址20位,偏移16位。将16位的段值左移4位得到20位的段起始地址。

段起始地址=段值*16;物理地址=段值*16+偏移

2.段寄存器引用

        除了字符串操作时目的段会自动采用附加段寄存器ES外,对附加段寄存器ES、FS、GS的应用必须采用显式的方式。所谓显式的方式,是指在指令中直接标明段寄存器。这个直接标明的段寄存器称为段超越前缀,超越的对象是默认引用的段寄存器。

例如:

MOV    EAX,[FS:1000H]

3. 16位的存储器寻址方式

基址、变址、位移量3个部分,可以缺省任意2部分。其余寄存器不能作为基址或变址寄存器。

4.调用系统功能

(1)第1号系统功能:接收用户键盘输入,出口参数在AL中

MOV    AH,1
INT    21H

(2)第2号系统功能:显示输出一个字符,入口参数在DL中

MOV    AH,2
INT    21H

(3)第9号系统功能:显示输出字符串,其入口参数为字符串首地址,DS含有段值,DS含有偏移

MOV    AX,CS
MOV    DS,AX        ;数据段和代码段相同

MOV    DX,hello
MOV    AH,9
INT    21H

(4)返回操作系统

MOV    AH,4CH
INT    21H

5.操作数表示

(1)为避免与普通标识符混淆,十六进制数应以数字开头,如果以字母开头,应该再加上数字0.

(2)汇编器NASM提供了BYTE、WORD、DWORD等关键字,用于说明操作数的类型。

6.伪指令语句和变量

(1)数据定义语句

[名称]        DB/DW/DD        参数表

名称是可选的,代表该语句所定义的若干数据中第一个数据项对应存储单元的有效地址。

result    db    0,0                ;定义了两个字节,字节值为0
          db    ‘H’,0DH,0AH,'$'      ;定义了四个字节

(2)存储单元定义语句

[名称]        RESB/RESW/RESD        项数

名称是可选的,代表预留存储单元的首地址。

buff    resb    128    ;预留128个字节
word    resw    4       ;预留4个字

(3)重复汇编前缀

TIMES        重复次数表达式        伪指令或者指令

times    10    db    3    ;重复“db    3”10次,即定义了10个字节
times    6    MOVSB

(4)常数符号化:符号代替常数

符号名        EQU        数值表达式

(5)特殊符号$和$ $

$:代表她所在源代码行的指令或者数据开始处在整个程序中的相对偏移。

$ $:代表当前段开始处在整个程序中的相对偏移。$ $可以获得当前段的起点,($ - $ $)得到当前位置在当前段内的差值。

7.段声明和段间转移

(1)段声明

        section/segment        段名

(2)转移 

直接转移:

        JMP        段名:标号

        JMP        FAR       label

        FAR表示远标号,NEAR表示近标号。

        把指令中的段值送到CS,把偏移送到IP实现转移。

间接转移:

        JMP        FAR        OPRD(双字存储单元)

        把双字存储单元OPRD中的高地址的字作为16位的段值送到CS,低地址的字作为16位的偏移送到IP实现转移。

8.段间过程调用和返回

CALL        段名:标号

CALL        FAR       label

CALL        FAR        OPRD

在执行过程调用时,首先把返回地址的段值和偏移压入堆栈各占2个字节,然后把指令中所带的段值送到CS,同时把偏移送到IP,从而转移到co

RETF

RETF        count

执行该指令时,从堆栈先后弹出返回地址的偏移和段值,分别送到IP和CS,从而实现过程(子程序)的段间返回。会把count加到SP上。

9.目标文件和段模式

(1)汇编器NASM支持对应的源程序含有一个特殊的汇编指示org,由它指示段的起始偏移。

(2)在用于生成obj格式的目标文件的源程序中,段名代表段值,不能安排起始偏移设定org,

程序开始执行的位置用..start给出

(3)生成COM文件,如果需要的话,程序开始执行的位置用begin给出。

(4)BITS        32和BITS        16

对于32位段,默认操作数尺寸时8和32位,存储器寻址方式是32位。

对于16位段,默认操作数尺寸时8和16位,存储器寻址方式是16位。

第七章 BIOS和虚拟机

不知道考什么,随便写吧

主引导记录(MBR)分析

(1)功能:把操作系统的引导程序装载到内存,并转操作系统的引导程序。

(2)传统的主引导记录由主引导程序(446字节)、磁盘分区表(64字节)和标记(2字节)三部分组成。

(3)执行步骤:①自身腾挪:由于操作系统的引导程序将占用起始地址为0000:7C00H的内存区域,因此MBR自身必须搬迁到另一个内存区域。②识别活动分区③加载引导程序

自身腾挪:

程序加载器

(1)加载器功能:工作程序的长度可以超过一个扇区,可以存放硬盘上的任意位置,只要占用的多个扇区是连续的;工作程序的开始执行点可以由程序员自行安排;工作程序运行时占用的内存区域可以较灵活。

(2)执行步骤:①准备运行环境②确定工作程序③读取指定工作程序的首个扇区④验证签名信息⑤获取工作程序的长度⑥决定工作程序被加载到内存的起始位置⑦搬移首个扇区的内容⑧读取指定工作程序的剩余扇区⑨转移到工作程序执行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值