汇编语言Rep MOVSW

来源:百度知道 编辑:UC知道 时间:2024/06/17 01:41:22
LEA SI,BU1
LEA DI,BU2
CLD
REP MOVSW
这是偏移地址BU1 100个字型数据,传送到偏移地址BU2内存区的命令。
1,没有rep会出现什么情况呢,MOVSW本身不就是把偏移地址为SI长度为CX的数据传到偏移地址为DI的内存嘛?为什么号必须有REp呢?我明白rep是CX自减一进行循环,但是没REp的话MOVSW不就把100个数据传过去了吗?循环做什么啊?
期望高手解答!!
2, LIT DD CYC

CYC: MOV AX
把标号CYC的段基址和偏移地址存放在变量LIT开始的4个字节单元中。
完全不解这语句的用途。
复制的那个字节是SI-100的那个字节嘛

1. MOVSW 每次搬移一个字,如果DF=0,所以每次搬运完 SI、DI 会增加 2,而 CX 仍然减少一。

如果DF=1,每次搬运完 SI、DI 会减少 2

复制的那个字节不是SI-100的那个字节,是最初的si所指的字数据
没有rep,一次只搬移一个字

rep的转换:每次执行的时候先执行cx=cx-1然后判断cx是否为0,如果是0说明REP MOVSW这个指令执行完毕了,直接跳转执行REP MOVSW的下一行语句,如果不为0,执行movsw也就是数据转移一次。

2, LIT DD CYC

CYC: MOV AX
把标号CYC的段基址和偏移地址存放在变量LIT开始的4个字节单元中。
此时CYC地址表达式,
JMP near 标号表示近转移,只需要偏移地址

段间转移是需要段地址和偏移地址

就需要这样定义变量LIT
也就是远转移JMP far 标号

在代码中near/far可以省略

1、你对movsw的用法理解错了,单独用这句命令时,只复制一个字到目标地址。
2、这样定义LIT变量,使得可以使用像这样的长跳转语句:JMP LIT。长跳转需要段基址和偏移地址。跳转分为短跳转、近跳转和远跳转,我们一般用的时候直接写成这样:JMP 标号,编译器会根据标号相对于当前跳转语句的偏移量来自动选择类型。如果LIT定义成这样:LIT DW CYC,那么JMP LIT就是近跳转的指令。