<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Architecting Life &#187; String</title>
	<atom:link href="http://xujiwei.com/blog/tags/string/feed/" rel="self" type="application/rss+xml" />
	<link>http://xujiwei.com/blog</link>
	<description>Just do it</description>
	<lastBuildDate>Thu, 05 Apr 2012 17:19:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>用汇编实现符串操作函数</title>
		<link>http://xujiwei.com/blog/string-operating-in-asm/</link>
		<comments>http://xujiwei.com/blog/string-operating-in-asm/#comments</comments>
		<pubDate>Mon, 29 Aug 2005 22:33:14 +0000</pubDate>
		<dc:creator>Xu Jiwei</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[ASM]]></category>
		<category><![CDATA[String]]></category>

		<guid isPermaLink="false">http://tmp.xujiwei.com/blog/?p=128</guid>
		<description><![CDATA[<a href="http://xujiwei.com/blog/string-operating-in-asm/" title="用汇编实现符串操作函数"></a>不管是在系统开发还是在平时的编程当中，字符串操作都是很重要的一部分。在C中，已经有库提供了strcpy、strcmp、strcat等函数， 而在开发用汇编开发自己的系统时，并没有现在的库可用，这就要求我们自己来实现字符串操作了。以下如果没有特别说明，字符串均以0为结束标志。 strcpy 字 符串复制 在字符串复制当中，为了简便，可以像在C中一样，不考虑边界问题，把这个问题交调用者，不过这样就有可能产生缓冲区溢出 了：）字符串复制还是比较容易实现的，只要在复制每一个字节之前判断是不是0，如果是就结束，不是则继续复制下一个字节。我给出一个简单的例子，当然，你 可以把它优化以产生更好的性能。 strcpy: ; in  si 源字符串起始地址 ;     di 目标地 址 ; out 无 push si push di  ; 保护寄存器 next: lodsb    ; 载 入一个字节 or al,al  ; 是0吗？ je end  ; 是则结束 stosb   ; 不 是则放入目标中 jmp next ; 继续下一个字节 end: mov [di],byte 0  ; 结 束标志 pop di  ; 恢复寄存器 pop si ret strlen 取 字符串长度 应该说，这一个比上一个容易，因为这个只需要考虑什么结束，而不需要去复制字节。 strlen: ; in si 源 字符串 ; out ax 字符串长度 push si push cx    ; 保护寄存器 xor cx,cx  ; 计 数器清零 next: &#8230;<p class="read-more"><a href="http://xujiwei.com/blog/string-operating-in-asm/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://xujiwei.com/blog/string-operating-in-asm/" title="用汇编实现符串操作函数"></a><p>不管是在系统开发还是在平时的编程当中，字符串操作都是很重要的一部分。在C中，已经有库提供了strcpy、strcmp、strcat等函数， 而在开发用汇编开发自己的系统时，并没有现在的库可用，这就要求我们自己来实现字符串操作了。以下如果没有特别说明，字符串均以0为结束标志。</p>

<p>strcpy 字 符串复制</p>

<p>在字符串复制当中，为了简便，可以像在C中一样，不考虑边界问题，把这个问题交调用者，不过这样就有可能产生缓冲区溢出 了：）字符串复制还是比较容易实现的，只要在复制每一个字节之前判断是不是0，如果是就结束，不是则继续复制下一个字节。我给出一个简单的例子，当然，你 可以把它优化以产生更好的性能。</p>

<p>strcpy:</p>

<p>; in  si 源字符串起始地址</p>

<p>;     di 目标地 址</p>

<p>; out 无</p>

<p>push si</p>

<p>push di  ; 保护寄存器</p>

<p>next:</p>

<p>lodsb    ; 载 入一个字节</p>

<p>or al,al  ; 是0吗？</p>

<p>je end  ; 是则结束</p>

<p>stosb   ; 不 是则放入目标中</p>

<p>jmp next ; 继续下一个字节</p>

<p>end:</p>

<p>mov [di],byte 0  ; 结 束标志</p>

<p>pop di  ; 恢复寄存器</p>

<p>pop si</p>

<p>ret</p>

<p>strlen 取 字符串长度</p>

<p>应该说，这一个比上一个容易，因为这个只需要考虑什么结束，而不需要去复制字节。</p>

<p>strlen:</p>

<p>; in si 源 字符串</p>

<p>; out ax 字符串长度</p>

<p>push si</p>

<p>push cx    ; 保护寄存器</p>

<p>xor cx,cx  ; 计 数器清零</p>

<p>next:</p>

<p>lodsb       ; 载入一个字节</p>

<p>or al,al     ; 是0？</p>

<p>je end     ; 是 则结束</p>

<p>inc cx      ; 字符串长度＋1</p>

<p>jmp next ; 继续下一个字节</p>

<p>end:</p>

<p>mov ax,cx ; 将 字符串长度放到AX中作为返回值</p>

<p>pop bx     ; 恢复寄存器</p>

<p>pop si</p>

<p>ret</p>

<p>strcat 字 符串连接</p>

<p>就个人来说，字符串连接用得并不是很多，但既然在C中有这个函数，就必然有它存在的理由，所以我们还是有必要来实现它的。 同样的，在字符串连接时不考虑目标缓冲区是否足够的问题，把这个交给调用者。</p>

<p>要将一个字符串连接到另一个字符之后，就需要先找出目 标字符串的结尾，即0的地址，然后就可以把这个地址做为目标，把需要连接的字符串的首地址做为源，调用strcpy即可完成。而找出0的地址，原理和取字 符串长度一样，载入一个字节然后判断是否为0。这个留大家自己去实现。</p>

<p>上面的例子使用的寄存器都是16位的，所以只能用在16位的 程序当中，当然，如果是你自己写的，那么自己懂得它实现的原理，移植到32位就是件很容易的事。</p>

<p>今天这篇就到这里喽～～难得写教 程之类的文章，今天还算顺手^-^～～</p>
]]></content:encoded>
			<wfw:commentRss>http://xujiwei.com/blog/string-operating-in-asm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

