吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7223|回复: 4
收起左侧

[第三课] 从零开始学习破解注册码-数据操作-2

[复制链接]
lxyg06 发表于 2017-5-26 15:09

上一章节介绍了几个常用的数据操作的
本章节主要介绍另外几个数据操作
这是网络摘录的


MOV MOVZX MOVSX的不同点
将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数。其中MOVSX是按有符号数扩展,MOVZX是按无符号数扩展。无符号数或正数高位扩展为0,负数高位扩展为全“1”。

交换指令
格式:XCHG OPR1,OPR2
  功能:交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。允许通用寄存器之间,通用寄存器和存储器之间交换数据。
  例 3.17
[Asm] 纯文本查看 复制代码
  XCHG AX,BX;通用寄存器之间交换数据(16位)
  XCHG ESI,EDI;通用寄存器之间交换数据(32位)
  XCHG BX,/[SI/];通用寄存器和存储器之间交换数据(16位)
  XCHG AL,/[BX/];通用寄存器和存储器之间交换数据(8位)

  使用该指令应注意以下问题:
  ·操作数OPR1和OPR2不允许同为存储器操作数;
  ·操作数数据类型必须一致;
  ·交换指令不影响标志位。
  如要实现存储器操作数交换,可用如下指令实现:
[Asm] 纯文本查看 复制代码
   MOV AL,BLOCK1
   XCHG AL,BLOCK2
   MOV BLOCK1,AL

二、堆栈操作指令
  1压栈指令
  (1) 格式:PUSH SRC
  功能:将源操作数压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器。当操作数数据类型为字类型,压栈操作使SP值减2;当数据类型为双字类型,压栈操作使SP值减4。
  例 3.19
[Asm] 纯文本查看 复制代码
  PUSH AX          ;通用寄存器操作数入栈(16位)
  PUSH EBX          ;通用寄存器操作数入栈(32位)
  PUSH [SI]         ;存储器操作数入栈(16位)
  PUSH DWORD PTR [DI]    ;存储器操作数入栈(32位)
  PUSHW 0A123H        ;立即数入栈(16位)
  PUSHD 20H         ;立即数入栈(32位)

  (2) 格式:PUSHA
       PUSHAD
  功能:PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,BP,SI,DI。
PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
  2出栈指令
  (1) 格式:POP DEST
  功能:从栈顶弹出操作数送入目的操作数。目的操作数允许为16或32位通用寄存器、存储器和16位段寄存器。当操作数数据类型为字类型,出栈操作使SP加2;当操作数数据类型为双字类型,出栈操作使SP加4。
  例 3.20
[Asm] 纯文本查看 复制代码
  POP AX          ;操作数出栈送寄存器(16位)
  POP ECX          ;操作数出栈送寄存器(32位)
  POP [BX]         ;操作数出栈送存储器(16位)
  POP DWORD PTR [SI]    ;操作数出栈送存储器(32位)

  (2) 格式:POPA
       POPAD
  功能:POPA从堆栈移出16字节数据,并且按顺序存入寄存器DI,SI,BP,SP,BX,DX,CX,AX中。
  POPAD从堆栈移出32字节数据,并且按顺序存入寄存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
  使用堆栈操作指令应注意以下问题。
  (1) 目的操作数不允许为CS以及立即数。
  (2) 堆栈操作指令不影响标志位。
算术运算指令
  80x86指令包括加、减、乘、除四种基本算术运算操作及十进制算术运算调整指令。二进制加、减法指令,带符号操作数采用补码表示时,无符号数和带符号数据运算可以使用相同的指令。二进制乘、除法指令分带符号数和无符号数运算指令。
  一、加法指令
  格式:ADDDEST,SRC
     ADCDEST,SRC
  功能:ADD是将源操作数与目的操作数相加,结果传送到目的操作数。ADC是将源操作数与目的操作数以及CF(低位进位)值相加,结果传送到目的操作数。
  源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
ADD,ADC指令影响标志位为OF,SF,ZF,AF,PF,CF。
  例 3.26
[Asm] 纯文本查看 复制代码
  MOV AX,9876H
  ADD AH,AL;AX=0E76H CF=1 SF=0O F=0 ZF=0 AF=0 PF=0
  ADC AH,AL;AX=8576H CF=0 SF=1O F=1 ZF=0 AF=1 PF=0

  二、减法指令
  格式:SUB DEST,SRC
     SBB DEST,SRC
  功能:SUB将目的操作数减源操作数,结果送目的操作数。SBB将目的操作数减源操作数,还要减CF(低位借位)值,结果送目的操作数。
  源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
SUB,SBB指令影响标志位为OF,SF,ZF,AF,PF,CF。
        三、加1减1指令
  格式:INC DEST
     DEC DEST
  功能:INC指令将目的操作数加1,结果送目的操作数。DEC指令将目的操作数减1,结果送目的操作数。目的操作数为通用寄存器或存储器操作数。
  INC,DEC指令影响标志位为OF,SF,ZF,AF,PF。
        四、交换相加指令
  格式:XADDDEST,REG
  功能:目的操作数加源操作数,结果送目的操作数。原目的操作数内容送源操作数。源操作数允许为通用寄存器。目的操作数允许为通用寄存器、存储器操作数。
  XADD指令影响标志位为OF,SF,ZF,AF,PF,CF。
  五、求补指令
  格式:NEGDEST
  功能:对目的操作数求补,用零减去目的操作数,结果送目的操作数。目的操作数为通用寄存器、存储器操作数。
  NEG指令影响标志位为OF,SF,ZF,AF,PF,CF。
  六、乘法指令
  (1) 格式:MULSRC
       IMULSRC
  功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。源操作数为通用寄存器或存储器操作数。目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX:AX,EDX:EAX中。
  字节乘:ALSRC→AX
  字乘:AXSRC→DX∶AX
  双字乘:EAXSRC→EDX∶EAX
  MUL,IMUL指令执行后,CF=OF=0,表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义。
  例 3.31
[Asm] 纯文本查看 复制代码
  MUL BL;字节乘
  MUL WORD PTR [SI];字乘
  IMUL BYTE PTR [DI];字节乘
  IMUL DWORD PTR [ECX];双字乘

  如果使用IMUL指令,积采用补码形式表示。
  (2) 格式:IMULDEST,SRC
  功能:将目的操作数乘以源操作数,结果送目的操作数。目的操作数为16位或32位通用寄存器或存储器操作数。源操作数为16位或32位通用寄存器、存储器或立即数。
  源操作数和目的操作数数据类型要求一致。乘积仅取和目的操作数相同的位数,高位部分将被舍去,并且CF=OF=1。其它标志位无定义。
  (3) 格式:IMUL DEST,SRC1,SRC2
  功能:将源操作数SRC1与源操作数SRC2相乘,结果送目的操作数。目的操作数DEST为16位或32位,允许为通用寄存器。源操作数SRC1为16位或32位通用寄存器或存储器操作数。源操作数SRC2允许为立即数。
  例 3.32  IMULEAX,[EBX],12H
  要求目的操作数和源操作数SRC1类型相同,当乘积超出目的操作数部分,将被舍去,并且使CF=OF=1,在使用这类指令时,需在IMUL指令后加一条判断溢出的指令,溢出时转错误处理执行程序。
  七、除法指令
  格式:DIV SRC
     IDIV SRC
  功能:DIV为无符号数除法,IDIV为带符号数除法。源操作数作为除数,为通用寄存器或存储器操作数。被除数缺省在目的操作数AX,DX:AX,EDX:EAX中。
  字节除法:AX/SRC商→AL,余数→AH
  字除法:DX·AX/SRC商→AX,余数→DX
  双字除法:EDX·EAX/SRC商→EAX,余数→EDX
  由于被除数必须是除数的双倍字长,一般应使用扩展指令进行高位扩展。当进行无符号数除法时,被除数高位按0扩展为双倍除数字长。当进行有符号数除法时,被除数以补码表示。可使用扩展指令CBW,CWD,CWDE,CDQ进行高位扩展。例如:
[Asm] 纯文本查看 复制代码
  MOV AX,BLOCK
  CWD;被除数高位扩展
  MOV BX,1000H
  IDIV BX

  对于带符号除法,其商和余数均采用补码形式表示,余数与被除数同符号。当除数为零或商超过了规定数据类型所能表示的范围时,将会出现溢出现象,产生一个中断类型码为“0”的中断。执行除法指令后标志位无定义。
  八、BCD算术运算
  十进制数在机器中采用BCD码表示,以压缩格式存放,即一个字节存储2位BCD码,BCD加减法是在二进制加减运算的基础上,对其二进制结果进行调整,将结果调整成BCD码表示形式。
  (1) 格式:DAA
  功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
  调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位),则
         AL+6→AL,1→AF,
若AL中高4位大于9,或标志CF=1,(表示高4位有进位),则
         AL+60H→AL,1→CF,
  DAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
  例 3.33
[Asm] 纯文本查看 复制代码
  ADD AL,BL
  DAA

  (2) 格式:DAS
  功能:将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
  调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高位借位),则
         AL-6→AL,1→AF
若AL中高4位大于9或标志CF=1(表示高4位向高位借位),则
         AL-60H→AL,1→CF
  DAS指令一般紧跟在SUB或SBB指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
  例 3.34
[Asm] 纯文本查看 复制代码
  SUB AL,BL
  DAS

  九、ASCII算术运算
  数字0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码,对于ASCII码的算术运算是在二进制运算基础上进行调整。调整指令有加、减、乘、除四种调整指令。
  (1) 格式:AAA
  功能:将存放在AL中的二进制和数,调整为ASCII码表示的结果。
  调整方法:若AL中低4位小于或等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1(进位),则AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。
  AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AF,CF。其它标志位无定义。
  例 3.35
[Asm] 纯文本查看 复制代码
  MOV AX,0036H
  ADD,AL,35H
  AAA;AX=0101H

  (2) 格式:AAS
  功能:将存放在AL中的二进制差数,调整为ASCII码表示形式
  调整方法:若AL中低4位小于等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1,则AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。
  AAS指令一般紧跟在SUB,SBB指令之后使用,影响标志位为AF,CF。其它标志位无定义。
  例 3.36
[Asm] 纯文本查看 复制代码
  MOV AX,0132H
  SUB AL,35H
  AAS;AX=0007H

  (3) 格式:AAM
  功能:将存放在AL中的二进制积数,调整为ASCII码表示形式。
  调整方法:AL/10商→AH,余数→AL
  AAM指令一般紧跟在MUL指令之后使用,影响标志位为SF,ZF,PF。其它标志位无定义。
  例 3.37
[Asm] 纯文本查看 复制代码
  MOV AL,07H
  MOV BL,09H
  MUL BL;AX=003FH
  AAM;AX=0603H

  (4) 格式:AAD
  功能:将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式。
  调整方法:AH10+AL→AL0→AH
  AAD指令用于二进制除法DIV操作之前,影响的标志位为SF,ZF,PF。其它标志位无定义。
  例 3.38
[Asm] 纯文本查看 复制代码
  MOV AX,0605H
  MOV BL,09H
  AAD;AX=0041H
  DIV BL;AX=0207H

  使用该类指令应注意,加法、减法和乘法调整指令都是紧跟在算术运算指令之后,将二进制的运算结果调整为非压缩BCD码表示形式,而除法调整指令必须放在除法指令之前进行,以避免除法出现错误的结果。
  使用算术运算类指令应注意:
  ·如果没有特别规定,参与运算的两个操作数数据类型必须一致,且只允许一个为存储器操作数;
  ·如果参与运算的操作数只有一个,且为存储器操作数,必须使用PTR伪指令说明数据类型;
  ·操作数不允许为段寄存器。
  ·目的操作数不允许为立即数;
  ·如果是存储器寻址,则存储器各种寻址方式均可使用。

免费评分

参与人数 6吾爱币 +5 热心值 +5 收起 理由
方天化。 + 1 + 1 我很赞同!
no_one + 1 + 1 用心讨论,共获提升!
ggluojianfeng + 1 谢谢@Thanks!
q396848273 + 1 谢谢@Thanks!
smith_k + 1 + 1 谢谢@Thanks!
zhu911 + 1 + 1 已答复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
黑莓 发表于 2017-5-26 15:55
提示: 作者被禁止或删除 内容自动屏蔽
fisher 发表于 2017-5-26 16:13
MOVSX,MOVZX 与MOV区别:

  1、MOVSX,MOVZX的操作数B所占空间必须小于操作数A.

  2、MOV指令是原值传送,不会改动。而MOVSX与MOVZX可能改动

3、MOVSX将用操作数B的符号位扩展填充操作数A的余下空间,如果是负数则符号位为1,如果是正数则和MOVZX功能相同

4、MOVZX将用0来扩展填充操作数A的余下空间。
smith_k 发表于 2017-5-26 17:58
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 08:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表