zoukankan      html  css  js  c++  java
  • 学 Win32 汇编[21] 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX


    汇编指令的一般性要求: 1、两个操作数的尺寸必须一致; 2、操作数不能同为内存.

    MOV(Move): 最常用的数据传送指令
    
    ;该指令不影响 EFlags
    ;指令格式: (其中的 r、m、i 分别表示: 寄存器、内存、立即数)
    MOV r/m, r/m/i
    
    ; Test21_1.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data? val dd ? .code main proc mov val, 123 mov edx, val mov eax, edx PrintDec eax ;123 ret main endp end main

    LEA(Load Effective Address): 有效地址传送指令
    
    ;该指令不影响 EFlags
    ;指令格式:
    LEA r, m
    
    ; Test21_2.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data szText db 'ABCDEFG', 0 .code main proc lea eax, offset szText lea ebx, szText PrintHex eax ;00403000 PrintHex ebx ;00403000 ret main endp end main

    XCHG(Exchange): 交换指令
    
    ;该指令不影响 EFlags
    ;指令格式:
    XCHG r/m, r/m
    
    ; Test21_3.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data val1 dd 111 val2 dd 222 .code main proc mov eax, val1 xchg eax, val2 mov val1, eax PrintDec val1 ;222 PrintDec val2 ;111 ret main endp end main

    XLATB(Translate Byte)、XLAT(Translate): 换码指令
    
    ;XLATB 可简化为 XLAT
    ;该指令不影响 EFlags
    
    ;XLAT 无参数, 操作和 EBX、AL 相关
    ;执行 XLAT 前, 先把源地址放入 EBX, 把字节序号放入 AL
    ;执行后, 指定字节被读入 AL
    
    ; Test21_4.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data szText db 'ABCDEFG', 0 .code main proc lea ebx, szText mov al, 1 xlat PrintHex al ;42 - 这是 'B' 的 ASSII 编码 mov al, 2 xlatb PrintHex al ;43 - 这是 'C' 的 ASSII 编码 ret main endp end main

    MOVZX(Move With Zero-Extend): 零扩展传送
    
    ;该指令不影响 EFlags
    ;指令格式:
    MOVZX r32, r16/m16
    MOVZX r16, r8/m8
    
    ;示例同 MOVSX

    MOVSX(Move With Sign-Extend): 符号扩展传送
    
    ;该指令不影响 EFlags
    ;指令格式:
    MOVZX r32, r16/m16
    MOVZX r16, r8/m8
    
    ;MOVZX 和 MOVSX 的区别是:
    ;1、MOVZX 会将目标寄存器中高出的位补 0
    ;2、如果源操作数的最高位是 1, MOVSX 会将目标寄存器中高出的位补 1; 反之补 0
    
    ; Test21_5.asm .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data bVal db 90h dwVal1 dw 7FFFh dwVal2 dw 8000h .code main proc movzx eax, dwVal1 movsx edx, dwVal1 PrintHex eax ;00007FFF PrintHex edx ;00007FFF movzx eax, dwVal2 movsx edx, dwVal2 PrintHex eax ;00008000 PrintHex edx ;FFFF8000 mov cl, bVal movzx ax, cl movsx dx, cl PrintHex ax ;0090 PrintHex dx ;FF90 ret main endp end main

  • 相关阅读:
    终于成功发布我的博客园处女贴,不过,真的颇费周章,两个htmleditor都非常不好用~~
    全文本代码着色(带源码和示例)
    BlogBench Ver 1.0 发布
    [在windows上使用Unix工具]cygwin
    Linux下压缩与解压
    Linux设置界面或命令行启动
    perl模块安装
    Linux下patch的制作和应用
    TAR命令参数详解
    在windows上使用Sysinternals工具
  • 原文地址:https://www.cnblogs.com/del/p/1711611.html
Copyright © 2011-2022 走看看