汇编语言(代码片段)

DismalSnail DismalSnail     2022-10-26     397

关键词:

汇编语言与接口技术

第二章

2.3

CPU 由执行单元(EU)和数据总线接口单元(BIU)两部分组成。

EU 的功能是执行指令,由算逻单元(ALU)、控制部件及一些寄存器组成。

BIU 的功能是给EU递交指令和数据,由总线控制部件、段寄存器和指令队列组成。


2.4 80x86寄存器组

技术分享图片

1. 通用寄存器

数据寄存器 用处
AX(accumulator) 作为 累加器 用,它是算数运算的主要寄存器。另外,所有的I/O指令都使用这一寄存器与外部设备传送信息
BX(base) 计算机存储器地址时,经常作为寄存器
CX(count) 在位移、循环和串处理指令中常用来做保存计数值
DX(data) 一般在做双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位;对某些I/O操作,DX可用来存放I/O的端口地址

指针寄存器 用处
SP(stack pointer)、ESP 堆栈指针寄存器,其中存放当前堆栈段栈顶的偏移量,他们总是与SS堆栈段寄存器配合存取堆栈中的数据。实模式下使用SP,在80386以上的保护模式下使用ESP
BP(base pointer)、EPB 基址指针寄存器。它可以与堆栈段寄存器SS联用来确定堆栈段中的吗某一存储单元的地址。并可以作堆栈区中的一个基地址以便访问堆栈中的信息。

变址寄存器 作用
SI(source index) 源变址寄存器 DI(destination index) 目的变址寄存器 一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能。

SP、ESP堆栈指针不能随意修改
***

2. 控制寄存器


指令指针寄存器

IP、EIP叫做指令指针寄存器,它总是与CS段寄存器配合指出下一条要执行指令的地址,其中存放偏移量部分。计算机用指令指针寄存器来控制指令序列的执行流程。
***

标志寄存器

运算结果特征标志 用处
CF(Carry Flag) 进位标志,记录运算结果的最高位向前产生的进位或借位。可用于检测无符号数二进制加减法运算时是否发生溢出(溢出时 CF=1)
PF(Parity Flag) 奇偶标志,记录运算结果最低位中含1的个数是奇还是偶。可用于检测数据传送过程中是否发生错误。
AF(Auxiliary carry) 辅助进位标志,记录运算结果低4位向前产生的进位或借位。只有在执行十进制运算指令时才关心此位。
ZF(Zero Flag) 零标志,记录运算结果是否位0。结果为0则置1,否则清0
OF(Overflow Flag) 溢出标志,记录运算结果是否超出了机器所能表示的范围。可用于检测带符号数运算时是否发生溢出(溢出时OF=1)
SF(Sign Flag) 符号标志,记录运算结果的符号。结果为负则置1,否则清0

控制标志(处理器) 用处
IF(Interrupt Flag) 中断允许标志,IF的控制只对外部可屏蔽中断请求(INTR)起作用。当IF=1时允许CPU响应INTR。
DF(Direction Flag) 方向标志。专服务于字符串操作指令,当DF位为1时,每次操作后使变址寄存器SI和DI减小,这样就使串处理从高地址向低地址方向处理。当DF位为0时,则使SI和DI增大。
TF(Trap Flag) 陷阱标志,用于程序调试。当TF=1 时,CPU处于单步方式;当TF=0时,CPU处于连续方式。
IOPL(I/O Privilege Level) 特权标志,占D13和D12两位。在保护模式下,用于控制对I/O地址空间的访问。只对80286以上CPU有效。
ID(Identification) 标识标志,若ID=1,则表示Pentium支持CPUID指令。只对Pentium以上CPU有效。

技术分享图片
***

3.段寄存器


IBM PC机的存储器采用分段管理方法组织,因此一个物理地址用段基址和偏移量 表示。
段寄存器存放段基址。在实模式下存放当前正在运行程序的段基地址,在保护模式下存放段选择子。


技术分享图片

段寄存器 用处
CS(code segment) 代码段寄存器,指定当前代码段,代码段中存放当前正在运行的程序段。
SS(stack segment) 指定当前堆栈段。
DS(data segment) 数据段寄存器,指定当前运行程序所使用的数据段。
ES(extra segment) 附加数据段寄存器,指定当前运行程序所使用的附加数据段

DS是主要的数据段寄存器,在默认情况下使用DS所指向段的数据。若要引用其它段中的数据,需要显式说明。
***

操作类型中段地址与偏移量的位置

技术分享图片

3.1.2寄存器寻址方式(register addressing)

在某些情况下,80x86允许程序员用段跨越前缀来改变系统所指定的默认段。格式为“段寄存器名:”。

但在以下三种情况下,不允许使用段跨越前缀:

  • 串处理指令的目的串必须使用ES段。
  • PUSH指令的目的和POP指令的源必须用SS段。
  • 指令必须存放在CS段中。

由于在汇编语言中用符号表示地址,所以指令“MOV AL,VAR”中的源操作数寻址方式是直接寻址,VAR是内存的符号地址。如写成“MOV AL,[VAR]”也可以,两者是等效的。

凡使用BP、ESP和EBP时,其默认段为SS段(缺省情况
操作数在堆栈段)。其它寄存器的默认段为DS寄存器(缺
省情况操作数在数据段) 。这两种情况都允许使用段超
越前缀。

把TAB的段基址送给AX寄存器

MOV AX,SEG TAB

把TAB的偏移量送给DI寄存器

MOV DI,OFFSET TAB

陌生的指令

XCHG(Exchange)

  • 格式

    XCHG OPR1,OPR2
  • 功能 交换两个操作数

    XCHG 寄存器 操作数,寄存器 操作数

    XCHG 寄存器 操作数,存储器 操作数

    XCHG 存储器 操作数,寄存器 操作数

输入输出指令(这组指令值限与使用累加器EAX,AX或 AL传送信息

输入指令IN(Input)

  • 格式

    IN ACR,PORT
  • 功能 把外设端口(PORT)的内容传送给累加器(ACR)。

  • 说明 可以传送8、16位、32位,相应的累加器选择ALAXEAX

输出指令OUT(Output)

  • 格式

    OUT PORT,ACR
  • 功能 把累加器的内容传送给外设端口。


在 80x86 里,所有 I/O 端口与 CPU 之间的通信都由 IN 和 OUT 指令来完成。其中 IN 完成从 I/O 到 CPU 的信息传送,二 OUT 则完成从 CPU 到 I/O 的信息。
***

地址传送指令(操作数的地址

传送有效地址指令LEA(Load Effective Address)

  • 格式
    LEA REG,SRG

  • 功能 把源操作数的有效地址传送给指定的寄存器。

  • 说明 源操作数必须是存储器操作数

加载数据段指针指令LDS(Load DS with Pointer)

  • 格式
    LDS REG,SRC

  • 功能 把源操作数中的FAR型指针拷贝到DS和指令中指定的通用寄存器。
  • 说明 若REG是16位的,
    则源操作数必须是32位的,其中低16位送寄存器,高16位送DS;若REG是32位的,则源操作数必须是48位的,其中低32位送寄存器,高16位送DS。目的寄存器REG不允许使用段寄存器。

二进制算术运算指令

类型转换指令

  1. 字节扩展成字指令CBW(Convert Byte to Word)

    • 格式
      CWB
    • 功能 把AL寄存器中的符号位值扩展到AH中
    • 示例

      ```
      MOV AL,5
      CBW ;(AH)=0,AL值不变

    MOV AL,80H
    CBW ;(AH)=0FFH,AL值不变
    ```

  2. 字扩展成双字指令CWD(Convert Word to Doubleword)

    • 格式
      CWD
    • 功能 把AX寄存器中的符号位值扩展到DX中。
  3. 双字扩展成四字指令CDQ(Convert Doubleword to Quad-Word)

    • 格式
      CDQ
    • 功能 把EAX寄存器中的符号位值扩展到EDX中。

二进制加法指令

  1. 加法指令ADD(Add)

    • 格式 ADD DST,SRC
    • 功能 (DST) + (SRC) -> DST
    • 说明 对操作数的限定同MOV指令
    • 标志 影响OF、SF、ZF、AF、PF、CF标志

  2. 带进位加法指令ADC(Add with carry)

    • 格式 ADC DST,SRC
    • 功能 (DST) + (SRC) + CF -> DST
    • 说明 由于考虑CF,所以可用于多字节或多字的加法
    • 标志 影响OF、SF、ZF、AF、PF、CF标志

  3. 加1指令INC(increment)

    • 格式 INC DST
    • 功能 (DST) + 1 ->DST
    • 说明 可以很方便地实现地址指针或循环次数加以1
    • 标志 影响OF、SF、ZF、AF、PF标志
  4. 交换并相加指令XADD(























汇编语言实验9(代码片段)

一:代码:实验结果:二:代码:实验结果:三:代码:assumeds:data,cs:codedatasegmentdb‘welcometomasm!‘db2H,24H,71H;字符串属性值dataendsstacksegmentdw8dup(0)stackendscodesegmentstart:movax,datamovds,ax;字符串及属性值所在段的段地址送入dsmovax,stacksgm 查看详情

《汇编语言》实验代码及详解(保姆级)(代码片段)

汇编语言实验七完整代码准备开发工具:notepad++(用来编写汇编代码)                        DOSBOX(windows系统中用来运行和调试汇编代码的编译器,在VMware的虚拟机linux环境下也可以实现运行,这里不... 查看详情

markdown标记语言(代码片段)

查看详情

javascript语言差距(代码片段)

查看详情

phpwpml语言菜单(代码片段)

查看详情

markdownclases语言环境(代码片段)

查看详情

markdownruby语言文档(代码片段)

查看详情

sqlsql语言元素(代码片段)

查看详情

php语言切换(代码片段)

查看详情

pythonpython的语言(代码片段)

查看详情

csharp语言对象(代码片段)

查看详情

汇编语言——实验六(代码片段)

题目6、字符串匹配算法原码=“IamanahuerinChina!”匹配串=“ahuer”输出Y或N代码:datasegmentmess1db'IamanahuerinChina!$'mess2db'ahuer$'dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds, 查看详情

汇编语言——实验五(代码片段)

题目5、(1)找出10个数(8位数)里的正数个数(数据自己定义)代码:datasegmentarraydb1,2,-3,-4,-5,6,-7,-8,9,-10dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axsubbx,bx 查看详情

第28章:使用汇编语言进行代码注入(代码片段)

说白了就是将汇编指令直接转换为IA-32的16进制格式.//CodeInjection2.cpp//reversecore@gmail.com//http://www.reversecore.com#include"windows.h"#include"stdio.h"typedefstruct_THREAD_PARAMFARPROCpFunc[2];//LoadLibraryA(),GetPr 查看详情

text铜语言样本(代码片段)

查看详情

ruby领域特定语言(代码片段)

查看详情

php获得前端语言(代码片段)

查看详情

markdownc#语言规范位置(代码片段)

查看详情