汇编问题rep movsb 和 cld 是什么意思?

请教汇编问题 CLD REP MOVSB

CLD就是字符串指针做自动增量操作
REP 就是字符串的无条件重复前缀 使REP后的指令无条件重复CX值指定的次数
MOVSB 就是将源串一字节传送到目地串,并自动修改指针值
合起来就是
LEA SI,DATA1
LEA DI,DATA2
MOV CX,5
CLD
REP MOVSB

把DATA1中5个字节传送到DATA2中

rep movsb完成的工作很多,DS:[SI]字节内容赋值给 ES:[DI],SI加一,DI加一(注:方向标志为0是递增,否则递减),CX减一,再判断CX决定是否继续,而这些操作无须在程序里写出来。而loop相当麻烦,需要在程序里明显写出如何做。麻烦是麻烦了但也提供了最大的灵活性。

先说说MOVSB(MOVe String Byte):即字符串传送指令,这条指令按字节传送数据(MOVSW为以字为单位传送字符串)。通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。

而REP(REPeat)指令就是“重复”的意思,术语叫做“重复前缀指令”。既然是传递字符串,如果程序设计者写成一个字(节)一个字(节)地传送,会显得相当繁琐。因此有必要用一个寄存器来控制串长度,用少量的代码达到一次性传送的目的。这个寄存器就是CX,指令每次执行前都会判断CX的值是否为0(为0结束重复,不为0,CX的值减1),以此来设定重复执行的次数。因此设置好CX的值之后就可以用REP MOVSB了。

CLD(CLear Direction flag)则是清方向标志位,也就是使DF的值为0,在执行串操作时,使地址按递增的方式变化,调整当前指针的执行方向。这条指令与STD(SeT Direction flag)的执行结果相反(指针方向递减),即置DF的值为1。

;example:把当前数据段中偏移1000H开始
;的100个字节数据传送到偏移2000H开始的
;单元中

cld ;指针方向递增
push DS ;当前数据段,因此压入栈中保存
pop ES ;使ES=DS
mov SI,1000H ;源串指针初值
mov DI,2000H ;目的串指针初值
mov CX,100 ;设置循环次数
Next:
lodsb ;取一个字节
stosb ;存一个字节
loop Next ;循环CX次

;以下程序片段与上面的等价:

cld ;方向增
……
mov CX,100 ;循环CX次
Next:
movsb ;每次传送一字节数据
loop Next

;或者用更简单的写法:
cld
……
mov CX,100 ;重复执行CX次movsb指令
rep movsb



  • 17563747204: 用汇编分支程序设计:两个任意数据块的复制程序
    嵇态:rep movsb ;升序复制 jmp @@Return Dec_Copy: std ;变址寄存器递增 add si,cx dec si add di,cx dec di rep movsb ;降序复制 Return: pop cx pop di pop si pop es popf ret Mov_Data_Block EndP Code Ends END Mov_Data_Block ;编译到此结束 ...
  • 17563747204: 汇编的编程题
    嵇态:rep movsb pop es pop ds main endp code ends end ;第3题 计算非数字字符个数 code segment assume cs:code main proc far start:mov bx,0;bx里存放着非数字字符的个数 ss1:mov ah,1 int 21h;输入一个字符放在al里 cmp al,'$'jz display ;判断是否为0-9 cmp al,'0'jb ss2 cmp ...
  • 17563747204: 用movsb实现字符串传输要解决哪些问题
    嵇态:cld ;方向标志 mov esi, 内存地址1 ;(也就是存放字符串的内存地址)mov edi, 内存地址2 ;(要移动到目的处的地址)mov ecx, 要移动的数量 ;rep movsb cld指令,是来控制我们重复移动时候的esi 和edi的递增方式。 cld是将我们的方向标志位DF设置为0,为0的话,每次我们rep循环的时候,esi和edi自动...
  • 17563747204: 用汇编语言编制一个 将内存BUFA单元存放的8个数字传送到BUFB单元中...
    嵇态:例:DATA SEGMENT BUFA db 'abcdefgh',0DH,0AH,'$'BUFB db 8 dup(?),0DH,0AH,'$'DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,8 MOV SI,OFFSET BUFA MOV DI,OFFSET BUFB REP MOVSB MOV DX,OFFSET...
  • 17563747204: 哪位大虾帮小妹编个汇编程序
    嵇态:rep movsb ;复制一个科目标题字符串 pop si pop cx inc dl ;科目序号增1 loop Title_Str ;下一个科目 lea si,Summation mov cx,9 rep movsb mov ax,0a0dh ;回车、换行 stosw mov al,'$' stosb Output Prompt_Str ;提示输入姓名、成绩 mov al,Num ;科目数 mov ah,8 ;每科标题长度 mul ah mov ...
  • 17563747204: 汇编的一个问题。将Data1单元开始的0~15个数送到Data2单元开始的数据区...
    嵇态:DATA2DB 10H DUP(?)DATA ENDS ;STACKSEGMENT PARA STACK 'STACK'DB 100 DUP(?)STACKENDS ;CODESEGMENT ASSUME CS:CODE,DS:DATA START:MOV BX,DATA MOV DS,BX MOV ES,BX MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 MOV CX,16 REP MOVSB RET CODE ENDS END START 运行后没有错误 ,你的...
  • 17563747204: 汇编语言编程
    嵇态:rep stosw pop di mov Buffer_Data,ID_Length+1 ;允许输入的最多字符数 lea dx,Buffer_Data ;学号输入缓冲区地址 mov ah,0ah int 21h lea si,Buffer_Data[2] mov cx,ID_Length ;学号字符数 rep movsb ;写入学生信息缓冲区 add Cursor_Col,12 call SetCursor ;置光标位置 call Input_Digit ;输入成绩 ...
  • 17563747204: 微机原理得指令问题
    嵇态:重复前缀 REP REPE REPZ REPNE REPNZ MOVS\/MOVSB\/MOVSW CMPS\/CMPSB\/CMPSW SCAS\/SCASB\/SCASW LODS\/LODSB\/LODSW STOS\/SYOSB\/STOSW 程序控制类 各种JMP指令,大概有32个,各种形式的 循环控制 LOOP\/LOOPZ\/LOOPE\/LOOPNZ\/LOOPNE 调用 CALL RET 中断 INT INTO IRET 处理器控制类 暂停 HLT 空操作 NOP 等待...
  • 17563747204: 求汇编期末考试题
    嵇态:CLD LEA SI,PATTERN LEA DI,DISPLAY MOV CX,80 REP MOVSB MOV AH,09H LEA DX,DISPLAY INT 21H RET CODE ENDS 参考资料: http:\/\/www.ohtvu.com\/uploadfile\/07shangfuxiziliao\/huipianyuyian.doc 本回答被提问者采纳 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...
  • 17563747204: 8086的编程题(使用汇编语言)
    嵇态:1、编两个通用过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换成二进制数。; 本程序通过编译,运行正确。Code Segment Assume CS:Code,DS:Code ; --- ; 功能:将AX中的二进制数转换成压缩型BCD码 ; 入口:AX=16位二进制数(因为压缩BCD码最大为:9999H,所以,AX的二进制...

  • 相关链接

  • two blacked bbc
  • bbc home news
  • bbc chinese food
  • stanleyblack&decker
  • 经验分享为自博友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
    有问题请发邮件给我们
    © 经验分享网