Intel汇编-递减传送字符串

# An example of the MOVS instructions (递减传送字符串)
#
# MOVS    把字符串从一内存位置传送到另一个内存位置的简单途径。
# movsb : 8bit
# movsw : 16bit
# movsl    : 32bit
#
# MOVS使用隐含的源和目标操作数。
# 隐含的源操作数是ESI寄存器,它指向源字符串的内存位置。 ESI(S)->source
# 隐含的目标操作数是EDI寄存器,它指向字符串要被复制到的目标内存位置。EDI(D)->destination
#
# 每次执行MOVS时,数据传送后,ESI和EDI寄存器会自动改变,为另一次传送做准备。但有时候这会变得有些难于处理。
# ESI和EDI自动传递增,也可能自动传递减,这取决于EFLAGS寄存器中的DF标志。
# DF清零, 增, DF被设置,减。
#
# CLD 用于将DF标志清零
# STD 用于设置DF标志
#
#
# 两种方式加载ESI、EDI值。
# 间接寻址:通过在内存位置标签前面添加美元符号,内存位置的地址被加载到ESI或EDI寄存器中
# movl $output, %ed        # 把output标签的32位内存位置传送给EDI
#
# LEA:加载一个对象的有效地址。
# leal output, %edi
#
    .section .data
value1:
    .ascii "This is a test string.\n"

    .section .bss
.lcomm output, 23

    .section .text
    .globl main
main:
    nop
    leal value1+22, %esi    # 指向字符串的末尾
    leal output+22, %edi    # 指output的末尾
    std
    movsb
    movsw
    movsl

    movl $1, %eax
    movl $0, %ebx
    int $0x80

# gcc -g -o 02 02-movs.s -m32
# x/23b &output
# 0x56559028 <output>:    ""
# 0x56559029 <output+1>:  ""
# 0x5655902a <output+2>:  ""
# 0x5655902b <output+3>:  ""
# 0x5655902c <output+4>:  ""
# 0x5655902d <output+5>:  ""
# 0x5655902e <output+6>:  ""
# 0x5655902f <output+7>:  ""
# 0x56559030 <output+8>:  ""
# 0x56559031 <output+9>:  ""
# 0x56559032 <output+10>: ""
# 0x56559033 <output+11>: ""
# 0x56559034 <output+12>: ""
# 0x56559035 <output+13>: ""
# 0x56559036 <output+14>: ""
# 0x56559037 <output+15>: ""
# 0x56559038 <output+16>: ""
# 0x56559039 <output+17>: ""
# 0x5655903a <output+18>: ""
# 0x5655903b <output+19>: "ng.\n"
# 0x56559040:     ""
# 0x56559041:     ""
# 0x56559042:     ""

# 向前移动时填充了7个内存位置,向后只填充了4个内存,为何?
#
# 和值如何被复制有关。
# 尽管ESI、EDI向后计数,MOVSW和MOVSL指令还是按照向前的顺序获得内存位置。当MOVSB指令完成时,它使ESI和EDI递减1,
# 但是MOVSW获得两个内存位置。同样,当MOVSW完成时,它使ESI和EDI递减2,但是MOVSL获得4个内存位置。
#
# 解决这个问题的方法是使每条指令使用相同长度的块进行传送。
#
# 记住:STD向后处理字符串,MOVSW和MOVSL仍旧向前获取内存位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值