Win32ASM学习[10]:传送指令

 

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

;mov

;该指令不影响 EFlags
;指令格式: (其中的 r、m、i 分别表示: 寄存器、内存、立即数)
mov r/m, r/m/i

 

    mov val, 123
    mov  edx
, val
    mov  eax, edx

    PrintDec edx      ;123

---------------------------------------------------------------------------------------------------------------

Lea

;该指令不影响 EFlags
;指令格式:
LEA r, m

 

.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

让我感到比较困惑的是   lea 的那条居然会输出地址  - -

---------------------------------------------------------------------------------------------------------------

XCHG(Exchange): 交换指令

 数据交换指令 XCHG

 格式: XCHG OPRD1,OPRD2 其中的OPRD1为目的操作数,OPRD2为源操作数

 功能: 将两个操作数相互交换位置,该指令把源操作数OPRD2与目的操数OPRD1交换.

 说明: 1. OPRD1及OPRD2可为通用寄存器或存储器,但是两个存储器之间是不能用XCHG指令  ----     实现的.

       2. 段寄存器内容不能用XCHG指令来交换.

          示例: XCHG AX,BX
                XCHG SI,AX
                XCHG CL,CH
                XCHG DX,BUFFER
                XCHG CH,DATA2[SI]
                SCHG WORDA,CX
 
       3. 若要实现两个存储器操作数DATA1及DATA2的交换,可用以下指令实现:
          示例: PUSH DATA1
                  PUSH DATA2
                  POP DATA1
                  POP DATA2

          注意: 此处通过中间寄存器,也很容易实现两个存储器操作数的交换.

       4. 本指令不影响状态标志位.

XCHG r/m, r/m

---------------------------------------------------------------------------------------------------------------

XLATB(Translate Byte)、XLAT(Translate): 换码指令

查表指令 XLAT/XLATB
 
 格式: XLAT TABLE 其中TABLE为一待查表格的首地址.
 ----  XLATB TABLE 其中TABLE为一待查表格的首地址.    
 功能: 把待查表格的一个字节内容送到AL累加器中.在执行该指令前,应将 TABLE先送至BX  ----  寄存器中,然后将待查节节与在表格中距表首地址位移量送AL,即 (AL)<--((BX)+(AL)).

;XLATB 可简化为 XLAT
;该指令不影响 EFlags
;XLAT 无参数, 操作和 EBX、AL 相关
;执行 XLAT 前, 先把源地址放入 EBX, 把字节序号放入 AL
;执行后, 指定字节被读入 AL

 

.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

---------------------------------------------------------------------------------------------------------------

MOVSX 指令

格式: MOVSX OPD,OPS

功能: 将8位或16位的OPS符号扩展为16位或32位, 再传给OPD.所谓的符号扩展, 就是当    ----  把一个字节扩展为字或是一字扩展为双字时,高位字节的各位和原数最高位相同,这        可以保证原来用补码表示的数值不变.这条指令一般用于带符号数的扩展.

如果源操作数的最高位是 1, MOVSX 会将目标寄存器中高出的位补 1; 反之补 0

说明: 指令举例

1. MOVSX EAX ,BX    
2. MOVSX ECX,CL    
3. MOVSX DX,DL

 

.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
-------------------------------------------------------------------------------------------------------------------------------


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值