学 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
时间: 2024-10-19 04:36:29

学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX的相关文章

二鸟学Win32 汇编——PE头文件

;代码段    .code;---------------------; 将内存偏移量RVA转换为文件偏移; lp_FileHead为文件头的起始地址; _dwRVA为给定的RVA地址;---------------------_RVAToOffset proc _lpFileHead, _dwRVA local @ret pushad mov esi, _lpFileHead assume esi:ptr IMAGE_DOS_HEADER add esi, [esi].e_lfanew ass

学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST

AND: 逻辑与 ;该指令会置 CF=OF=0; 其结果影响 SF.ZF.PF ;指令格式: AND r/m, r/m/i ; Test22_1.asm - 使用 AND 运算将一个数的第二.四位清零 .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib

Win32 汇编 - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转);三.根据 EFLAGS 寄存器的标志位跳转, 这个太多了. 根据标志位跳转的指令: JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;无符号大于则跳转 JNA

学 Win32 汇编[20]: 洞察标志寄存器

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 上表是 32 位寄存器 EFLAGS 的低 16 位. 不能直接读写 EFLAGS, 但有些方便的指令, 如:LAHF: 读取EFLAGS 低 8 位到 AH; SAHF 是 LAHF 的反向操作.

汇编中中括号[]作用以及lea和mov指令的区别

现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令:对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:mov eax,2lea ebx,[eax];执行后ebx=2mov ebx,eax;等同于上句lea ebx,eax;编译器报错: error A2070: invalid instruction operands 对于变量来说加不加[]都是一样的效果,都是取变量的地址,相当于指针如:num dword 2lea ebx,numl

总结一下汇编中mov,lea指令的区别

最近在学习汇编语言,过程中遇到很多问题,对此在以后的随笔会逐渐更新,这次谈谈mov,lea指令的区别 一,关于有没有加上[]的问题 1,对于mov指令来说: 有没有[]对于变量是无所谓的,其结果都是取值 如: num dw 2 mov bx,num mov cx,[num]:bx=cx=2 对于寄存器而言,有[]表示取地址,没[]表示取值 如: num dw 2 mov ax,num mov bx,ax;bx=2 mov bx,[ax];mov bx;DS:[ax],这里可能存在报错的情况,总之

linux平台学x86汇编(六):数据的传送

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 前面讲了定义数据元素,既然定义了数据元素,那么就需要知道如何处理这些数据元素.数据元素位于内存中,并且处理器很多指令要使用寄存器,所以处理数据元素的第一个步骤就是在内存和寄存器之间传送它们.数据传送指令为mov,其为汇编语言中最常用的指令之一. mov指令的基本格式如下: movx source, dest 其中source和dest的值可以是内存地址.存储在内存中的数值.指

汇编指令mov、add、sub、jmp

mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄存器 add:寄存器,数据 add:寄存器,寄存器 add:内存单元,寄存器 add:寄存器,内存单元 sub:寄存器,数据 sub:寄存器,寄存器 sub:内存单元,寄存器 sub:寄存器,内存单元 jmp:段地址:偏移地址  用段地址修改CS 用偏移地址修改IP jmp:寄存器,只用寄存器的内容

linux平台学x86汇编(四):从“hello world!”开始

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 汇编语言程序由定义好的段构成,每个段有各自的目的.三个最常用的的段如下:数据段.bss段.文本段.文本段是可执行程序内声明指令码的地方,所有汇编程序都必须有文本段,数据段和bss段是可选的,但是在程序中经常使用.数据段声明带有初始值的变量,bss段声明使用0值初始化的数据元素,这些元素常用作汇编程序的缓冲区.下图为汇编语言程序的布局. GNU汇编器使用.section命令语句