逆向基础--数据传输指令mov和xchg (10)

一. 介绍

  数据传输指令包括:mov、 xchg、xlat、 lea、 lds、 les、push、 pop、pushf、lahf、 sahf、 popf、in、out。

  重点掌握:mov、 xchg、xlat、 lea、push、 pop

  扩展:已知8086是16位CPU,其寄存器分为通用寄存器、段寄存器、指针和变址寄存器等。

16位通用寄存器 8位寄存器 段寄存器 指针和变址寄存器
AX AX分为高8 AH、低8  AL CS 代码段 SP堆栈指针
BX BX分为高8 BH、低8 BL DS 数据段 BP基址指针
CX CX分为高8 CH、低8CL SS 堆栈段 SI源变址寄存器
DX DX分为高8 DH、低8DL ES 附加段 DI目的变址寄存器

  16位通用寄存器:它们都可用于存放数据、参与算术运算、逻辑运算等。但它们有特定的用途,了解这些区别有助于编写更高效的汇编代码,并避免错误。

  以下是一些常见的特定用途包括 :

    1)AX(累加器寄存器)

      主要算术寄存器:默认用于乘除法运算

      I/O操作:用于输入输出指令

      高效率:某些指令使用AX时执行更快

; AX 用于乘除法
MOV AX, 100   ; 将100存入AX
MOV BX, 20    ; 将20存入BX
MUL BX        ; AX = AX * BX=2000  MUL BX 中MUL指令用于无符号乘法,默认与AX相乘

    2)BX (基址寄存器)

      内存寻址:唯一可用于内存寻址的通用寄存器

      数组索引:常用于数组操作

      基地址:存放内存段的基地址

; BX 用于寻址
MOV BX, 0x1000 ; 将内存地址0x1000存入BX
MOV AX, [BX]   ; 将BX所指内存地址的内容加载到AX 

    3) CX(计数寄存器)

      循环计数:用于LOOP指令

      字符串操作:用于REP前缀的字符串指令

         移位计数:CL用于指定移位位数

; CX 用于循环
MOV CX, 10     ; 设置循环10次
label:
   ; 循环体
   LOOP label  ; CX减1,如果CX不为0则跳转到label

    4)DX(数据寄存器)

      I/O端口地址:用于指定I/O端口

      乘除法扩展:在32位乘除法中存放高16位

      数据寄存器:一般数据操作

; DX 用于端口输出
MOV DX, 0x3F8  ; 设置端口号, 0x3F8  ==1016端口
MOV AL, 'A'    ; 要发送的数据
OUT DX, AL     ; 将AL中的数据输出到DX指定的端口 

 

二. mov指令

  作用: 是把一个字或者字节的操作数从源地址传送到目的地址

  使用格式:mov  target, source

  mov指令可以操作格式表格如下:其中reg是指通用寄存器、mem是指内存或存储器、imm是指立即数(如:0123H)、seg是指段寄存器

 

格式:mov reg/mem, imm

示例:mov ax, 0123   ; 对应的格式是 mov reg/ imm

格式:mov reg/mem/seg, reg

 示例:mov ax, bx  ; 对应的格式是 mov reg/ reg

格式:mov reg/seg, mem 示例:mov ax, [0x1000]; 将内存地址0x1000处的字(16位)加载到AX
格式:mov reg/mem, seg 示例:mov ax, [data_segment]  ; 从内存读取段值到AX

  注意事项:

    1)target不能是cs(代码段寄存器)。cs不能通过mov指令去改变。是出于完整性保护:CS:IP必须同时更新,单独改变CS而没有相应改变IP会导致不可预测的行为。

       错误示例:mov cs, ax 或者 mov cs, 0123  

       正确示例:格式:jmp cs:ip   如 jmp  0x2000:0x1000 ; 执行后:CS = 0x2000, IP = 0x1000 下一条指令从地址 0x21000 (0x2000×16 + 0x1000) 处开始执行,整个程序的执行路径完全改变

    2)  target和source不能同时为内存数,或者段寄存器(cs\ds\es\ss\fs\gs)。

      错误示例:mov mem, mem      

      正确示例:mov ax, [source] ; 先从源内存加载到寄存器

              mov [destination], ax ; 再从寄存器存储到目标内存

      错误示例:mov ds, es ; 试图将es段寄存器的值复制到ds段寄存器

      正确示例:mov ax, ds ; 第一步:将DS段寄存器的值加载到通用寄存器AX

           mov es, ax ; 第二步:将AX的值复制到ES段寄存器

    3) 不能将立即数传送给段寄存器,

      错误示例:mov ds, 0123 ; 试图将立即数复制到段寄存器

      正确示例:mov ax, 0123 ; 第一步:将立即数0123h加载到通用寄存器AX

           mov ds, ax  ; 第二步:将AX的值复制到DS段寄存器

    4)target和source必须类型匹配,要么都是字节,要么都是字或者双字(32位)等。

      错误示例:mov al, 0022 ; 已知AX=AH+AL, 0022是16位2个字节不能存储在al低8位

      正确示例: mov al, 22

    5)由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target数的位数相同,再进行传送。

      示例:mov al ,4 ; 表示4会作为8位来处理

            mov ax, 4 ; 表示4会作为16位来处理

image

 

三.xchg指令

   xchg是exchange的缩写,作用:用于交换两个操作数的值 。操作数是字或者字节。

   格式:xchg  oprd1 ,  oprd12

  xchg指令可以操作格式表格如下:

格式:xchg reg,reg 示例:xchg al, cl  ;都是低8位的寄存器,把al与cl的值互换
格式:xchg reg,mem 示例:xchg ax, [bx] ;
格式:xchg mem,reg 示例:xchg  [bx], ax ;

  简单演示将al与cl的值互换,如下所示:    

image

  注意事项

    1)不能同时都为二个内存操作。 错误示例 xchg mem, mem

    2)  任何一个寄存器都不能是段寄存器。 错误示例 xchg ax, cs

    3)  任何一个操作不能是立即数。 错误示例 xchg ax, 0123

    4)两个操作数的长度必须相等。 错误示例 xchg ax, cl 

 

 

posted on 2025-11-10 15:14  花阴偷移  阅读(0)  评论(0)    收藏  举报

导航