df位、串传送

昨天高中同学会,今天白天又有事,所以决定把标志寄存器这章结束掉,下面是串操作笔记
movsb:
传送一个字节
相当于:
(1) ((es)*16+di)=((ds)*16+si)
(2) df=0 (si)=(si)+1
(di)=(di)+1
df=1 (si)=(si)-1
(di)=(di)-1
movsw:
传送一个字
rep movsb相当于:
s:movsb
loop s
可见rep是根据cx进行循环的

cld指令:df清零
std指令:df置1

下面写出利用movsb与rep配合copy字符串:
assume cs:code,ds:data,es:extra
data segment
db ‘welcome to masm!’
data ends
extra segment            ;事实上不需要两个段,但这样更清晰
db 16 dup (0)
extra ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
mov si,0
mov di,0
mov cx,16
cld

rep movsb

mov ax,4c00h
int 21h
code ends
end start

书中未写出对串的其他操作,下面仅写出利用movsb倒序copy字符串的程序:
assume cs:code,ds:data,es:extra
data segment
db ‘welcome to masm!’
data ends
extra segment
db 16 dup (0)
extra ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
mov si,0
mov di,15
mov cx,16

cld

s:    movsb            ;因为si加1的同时,di要减1,所以不能rep movsb
sub di,2        ;movsb后di加了1,这里手动减2,从而实现di减1的效果
loop s

mov ax,4c00h
int 21h
code ends
end start
接下来就是中断的学习了,事实上,到此为止的内容以前就比较熟悉,所以复习的较快,以前学中断只是水水的看了些片段,接下来要重点学习了,尽管实际上这部分对win32下的反汇编意义不大。。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>