汇编字符串拷贝

 1 DATAS SEGMENT
 2     str1 db ‘it is a temp string‘,0ah, 0dh,‘$‘
 3     str2 db 50 dup(?)
 4     msg1 db 0ah,0dh,‘source string:‘,‘$‘
 5     msg2 db 0ah,0dh,‘distance sting:‘,‘$‘
 6 DATAS ENDS
 7
 8 STACKS SEGMENT
 9     ;此处输入堆栈段代码
10 STACKS ENDS
11
12 CODES SEGMENT
13     ASSUME DS:DATAS,CS:CODES
14 START:
15     MOV AX,DATAS
16     MOV DS,AX
17
18     lea si,str1;
19
20     MOV ax,seg str2;
21     mov ES,AX;
22     lea di,str2;
23
24     mov CX,22;
25 again:
26     movsb;
27     loop again;
28
29     lea dx,msg1;
30     mov ah,09h;
31     INT 21H;
32
33     lea DX,str1;
34     mov ah,09h;
35     INT 21H;
36
37     lea dx,msg2;
38     mov ah,09;
39     INT 21H;
40
41     lea DX,str2;
42     mov ah,09h;
43     INT 21H;
44
45     mov ah,4ch;
46     INT 21h;
47 CODES ENDS
48     END START

以上代码参考http://blog.csdn.net/u013507368/article/details/40859081。

汇编传送指令参考http://www.doc88.com/p-296946327212.html

【1】0dh表示回车符号,这只是一个表示这一行终止的符号,不可见的,0Ah表示换行,就是跳转到下一行,两者用表示回车换行!

【2】DUP是数据定义伪指令,它可以按照给定的次数来复制某个(某些)操作数,可以避免多次键入同样一个数据。例如 str1 db 6 dup(12H)和str1 db 12H,12H,12H,12H,12H,12H是等价的。问号是未初始化,不管它的值,只占用字节

【3】要用assume把段跟段寄存器对应起来的原因是原来的DOS找到的空闲内存的地址不是固定的,无法找到一个地址在任何时候都是空闲的。于是DOS需要可以重定位的程序,而当时的定位方式就是设置段寄存器的值使该程序能在可分配(空闲)的内存中可用。那就需要知道某个段被重定位时候需要修改哪个段寄存器的值才能正确执行。assume提供这种段和重定位代码时需要对应修改的寄存器的关系给编译器,编译器再这个信息写到二进制文件中去。比如DOS下的exe程序记录在文件头中。

【4】INT 21H是DOS功能调用,调用功能号放在AH中,使用格式如下:MOV AX fn; INT 21H.DOS系统功能调用参考:http://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html

【5】ES寄存器   附加段寄存器:定义附加段的起始地址。 程序中其他段得起始地址。  用于某些串操作中和DI寄存器相关联  (ES)+(DI)=串地址的结尾。具体例子见https://zhidao.baidu.com/question/539021846.html

【6】MOVSB即字符串传送指令,这条指令按字节传送数据。通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。

【7】变量的存储包括段地址和偏移地址。SEG就是取段地址的。比如:

data segment

    ore 10h    STRING  db ‘hello, world$‘data ends

假设data = 1234h,则:mov di, seg string  ;di = string所在段地址,即1234hmov ei, offset string; ei = string偏移地址,即10h
时间: 2024-10-12 02:10:31

汇编字符串拷贝的相关文章

字符串拷贝函数strcpy写法_转

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// CppReference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" using namespace std; /* * 说明:字符串拷贝版本1 * 参数:dest目标地址,src源地址 * 返回:返回拷贝好的地址:如果出错或者有重叠,无

虚怀若谷 字符串拷贝函数strcpy写法_转

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// CppReference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" using namespace std; /* * 说明:字符串拷贝版本1 * 参数:dest目标地址,src源地址 * 返回:返回拷贝好的地址:如果出错或者有重叠,无

编写实现字符串拷贝函数strcpy()完整版

有个题目编程实现字符串拷贝函数strcpy(),很多人往往很快就写出下面这个代码. void strcpy( char *strDest,char *strSrc ) { while(( *strDest++ = * strSrc++) != '\0' );//逐个赋值字符串数组中的数据,知道字符串结束 } 其实仔细看看这个实现过程并不完美,严格来说非常不严谨,我们可以完善一下. char * strcpy( char *strDest, const char *strSrc )//将源字符串加

c语言:两种方法实现字符串拷贝strcpy

实现字符串拷贝strcpy 方法一: // 字符串拷贝函数的实现 #include<stdio.h> #include<assert.h> void my_strcpy(char *dest,  char *src)//src表示source源,dest目标 { assert(dest!=NULL); assert(src); char *ret = dest; while (*dest++ = *src++) { ; } return dest; } int main() { c

Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

概述 随着流行的缓冲区溢出攻击的增加,越来越多程序员开始使用带有大小,即有长度限制的字符串函数,如strncpy() 和strncat() .尽管这种趋势令人十分鼓舞,但通常的标准C 字符串函数并不是专为此而设计的.本文介绍另一种直观的,一致的,天生安全的字符串拷贝API . 当函数 strncpy()和 strncat()作为 strcpy()和 strcat()的安全版本来使用时,仍然存在一些安全隐患. 这两函数以不同的,非直观的方式来处理NUL 结束符和长度参数,即使有经验的程序员也会混淆

makefile规则编写&amp;C语言字符串拷贝&amp;vim介绍

makefile规则:[email protected]:目标文件$^:所有的依赖文件$<:第一个依赖文件-c:输出目标代码,不输出可执行文件-g:编译器编译的时候提供以后对程序调试的信息target:rules    gcc -o [email protected] $^install:    cp target /usr/local/binclean:    rm target    lib库查找方法:nm -o /lib/*.so | grep "函数名字" nm -o /

C++内存问题大集合(指针问题,以及字符串拷贝问题,确实挺危险的)

作者:rendao.org,版权声明,转载必须征得同意. 内存越界,变量被篡改 memset时长度参数超出了数组长度,但memset当时并不会报错,而是操作了不应该操作的内存,导致变量被无端篡改 还可能导致内存越界的函数有memset.memcpy.memmove.strcpy.strncpy.strcat.sprintf等等 临时指针问题,std::string.wstring的c_str()是个临时指针 c_str()返回值是个char*/wchar_t*指针,这个数组的数据是临时的,当有一

关注C++细节——字面值初始化字符数组及字符串拷贝注意

char carr[] = "author:CSDN-iaccepted"; 此时,carr数组中元素的个数为21,最后一个位置用来存放空字符'\0'. 所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的. int clen = strlen(carr); int size = sizeof(carr); 这时候得到的clen = 21,size= 22.这就是因为strlen统计串中字符的个数,不计算最后的空字符,但是si

字符串拷贝问题

问题:把源字符串拷贝到目的字符串,如果指定关键字,则以该关键字结束(不包括关键字本身),如果拷贝失败,则得到空串.具体要求:实现如下函数原型SafeStrcpy2KeyWord(),并在代码中调用该函数实现上述功能.该函数的实现要考虑各种可能的参数取值,以确保程序不出现崩溃. int SafeStrcpy2KeyWord(char* pDestBuffer,    //拷贝的目的地地址 char* pSourceString,    //拷贝的源地址 int nDestBufferSize,