第四次实验
汇编程序编写和提高
1、编写一个程序,实现复制字符串的功能,并将复制的字符串正序倒序显示出来。 流程图:
程序如下:
DATAS SEGMENT
string_a db 'the future is beautiful';要操作的字符串 count equ $-offset string_a;把字符串的长度存入count
data1 db 'the zhengxu is:','$';输出正序是 data2 db 'the fanxu is:','$' ;输出反序是 DATAS ENDS
STACKS SEGMENT
string_b db 100 dup(?);建栈段存放复制的字符串 STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS
MOV DS,AX;把datas的段地址分别给DS,ES mov es,ax
lea si,string_a;取string_a的偏移地址给si lea di,string_b;取string_b的偏移地址给di
mov cx,count;把字符串长度给cx,决定循环的次数
Cld;DF置零,使DI,SI自增
rep movsb;把string_a里的字符串复制到string_b,循环次数为 ;CX
mov cx,count;把count赋给CX,决定输出正序循环次数 lea dx,data1;输出data1里的字符 mov ah,09 int 21h
xor di,di;DI置零 output1:
mov dl,[string_b+di];把string_b偏移地址给DL mov ah,02h
int 21h;输出数据段string_b里的一个字符 inc di;DI自增,指向下一个字节 loop output1;循环输出 mov cx,count;CX重新获值
lea dx,data2;把data2的偏移地址赋给DX mov ah,09
int 21h ;输出提反序输出的提示字符 output2:
dec di;上一次循环DI指向要输出字符串的下一个字节,先自减, ;使他指向最后一个字符 mov dl,[string_b+di]
mov ah,02
int 21h;输出反序的字符串 loop output2
MOV AH,4CH INT 21H;结束dos CODES ENDS
END START;程序结束
运行结果:
过程中有几次语法错误,比如直接 MOV DI,STRING_B,提示错误,不能直接把数据段的偏移地址赋给DI,应该用LEA。
百度得知:LEA为硬指令,在程序执行阶段得出偏移地址,offset是伪指令,在编译阶段得出偏移地址。论速度的话,offset比LEA快得多,但是,灵活性和复杂度,offset远不如LEA。

