汇编问题rep movsb 和 cld 是什么意思?
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
嵇态: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 ;编译到此结束 ...
嵇态: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 ...
嵇态:cld ;方向标志 mov esi, 内存地址1 ;(也就是存放字符串的内存地址)mov edi, 内存地址2 ;(要移动到目的处的地址)mov ecx, 要移动的数量 ;rep movsb cld指令,是来控制我们重复移动时候的esi 和edi的递增方式。 cld是将我们的方向标志位DF设置为0,为0的话,每次我们rep循环的时候,esi和edi自动...
嵇态:例: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...
嵇态: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 ...
嵇态: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 运行后没有错误 ,你的...
嵇态: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 ;输入成绩 ...
嵇态:重复前缀 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 等待...
嵇态: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 本回答被提问者采纳 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...
嵇态:1、编两个通用过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换成二进制数。; 本程序通过编译,运行正确。Code Segment Assume CS:Code,DS:Code ; --- ; 功能:将AX中的二进制数转换成压缩型BCD码 ; 入口:AX=16位二进制数(因为压缩BCD码最大为:9999H,所以,AX的二进制...