zoukankan      html  css  js  c++  java
  • 学 Win32 汇编[21]

    汇编指令的一般性要求: 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
    不追热点、不关时政、不要喧哗、不惹纷争、做自己喜欢的事,过宁静的生活。
  • 相关阅读:
    关于数组的一些面试题目及答案
    java类的定义以及参数传递
    第39届大学生程序设计大赛亚洲区域赛广州站比赛总结
    模拟退火法(吊打XXX)Bzoj3680
    树链剖分(单点更新,求区间最值,区间求和Bzoj1036)
    树链剖分(线段树区间更新求和(lazy操作)hdu3966)
    最大权闭合图(Road constructions)hdu3917
    最大权闭合图最大获益(把边抽象为点)HDU3879
    最大权闭合图hdu3996
    最大密集子图(01分数规划+二分+最小割)POJ3155
  • 原文地址:https://www.cnblogs.com/dsli/p/7221503.html
Copyright © 2011-2022 走看看