概述
# 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仍旧向前获取内存位置。
最后
以上就是成就钢笔为你收集整理的Intel汇编-递减传送字符串的全部内容,希望文章能够帮你解决Intel汇编-递减传送字符串所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复