- 浏览: 108861 次
- 性别:
- 来自: Mars
文章分类
最新评论
-
a376730551:
红色部分表示 把进位值传递给bh
汇编语言AAA指令多字节加法代码分析(5) -
madbluesky:
死了,只剩下赞扬了...看来不只是中国,全世界都是同一套啊.. ...
麦克杰克逊--------世界上最傻的明星 -
sunloveny:
敬你!
麦克杰克逊--------世界上最傻的明星 -
jiorry:
感动
MJ 一路走好
麦克杰克逊--------世界上最傻的明星 -
javaboy2006:
MJ单纯到不懂得保护自己。永远怀念。
麦克杰克逊--------世界上最傻的明星
来自于《Intel汇编语言程序设计》(第四版)第八章。
裁剪字符串过程从以空字符串结尾的字符串中删除特定字符之后的所有字符。
需要的知识:
1.
重复前缀。
字符串操作指令本身每次只处理一个内存值。但如果增加一个重复前缀的话,该指令就会使用ECX作为计数器进行重复。
几个重复前缀如下:
REP 当ECX>0时重复
REPZ,REPE 当零标志被设置并且ECX>0时重复
REPNZ,REPNE 当零标志被清除并且ECX>0时重复
2.
SCASB,SCASW和SCASD指令,将AL/AX/EAX中的值同目标内存中的字节,字或双字相比较,目标内存数据是由EDI寻址的。
这些指令在一个长字符串或数组中查找一个值的时候特别有用。
如果使用REPE(或REP)前缀,当ECX>0并且AL/AX/EAX不能匹配内存中的值时,指令将继续扫描字符串或数组。
REPNE前缀使得指令扫描字符串直到AL/AX/EAX匹配内存中的一个值或ECX=0为止。
例如下面扫描匹配字符的例子,在字符串变量alpha中查找字符"F",如果找到了该字母,EDI指向匹配字符串后面的一个字符(如果没有找到匹配项,就会执行JNZ指令退出):
.data
alpha BYTE "ABCDEFGH",0
.code
mov edi,OFFSET alpha ; EDI points to the string
mov al,'F' ; search for the letter F
mov ecx,LENGTHOF alpha ; set the search count
cld ; direction = up
repne scasb ; repeat while not equal
jnz quit ; quit if letter not found
dec edi ; found : back up EDI
整个程序的重点就在于红色部分,他会一直循环,直到匹配了F或者ECX=0为止。甚至在循环完之后,还会对是这两种条件的哪一种进行判断。如果是ECX=0(就是循环了所有的字符之后仍未找到),则直接quit;如果不是,则必定是因为匹配了F,则将EDI后退一个字节,指向被匹配的这个字符。
在Str_trim中,我们也要用到scasb。
3.
字符串指令使用CPU的方向标志来决定ESI和EDI是自动增加还是自动减少:
可以使用CLD和STD指令显式地改变,CLD将清除方向标志,STD设置方向标志,其造成影响如下所示:
方向标志被清除:ESI和EDI自动增加,寻址顺序按照从低到高。
方向标志被设置:ESI和EDI自动减少,寻址顺序按照从高到低。
下面我们来看一下裁剪字符串程序源代码:
;----------------------------------------------------------------------------
Str_trim PROC USES eax ecx edi,
pString : PTR BYTE, ; points to string
char : BYTE ; char to remove
;
; remove all occurrences of a given character from
; the end of a string.
; Returns : nothing
;----------------------------------------------------------------------------
mov edi,pString
INVOKE Str_length,edi ; returns length in EAX
cmp eax,0 ; zero-length string ?
je L2 ; yes : exit
mov ecx,eax ; no : counter = string length
dec eax
add edi,eax ; EDI points to last char
mov al , char ; char to trim
std ; direction = reverse
repe scasb ; skip past trim character
jne L1 ; remove first character ?
dec edi ; adjust EDI : ZF=1 && ECX=0
L1: mov BYTE PTR [edi+2],0 ; insert null byte
L2: ret
Str_trim ENDP
程序首先使用:
USES eax ecx edi,
将这几个寄存器的值压进堆栈保存起来。
然后函数接受两个参数:
pString : PTR BYTE, ; points to string
char : BYTE ; char to remove
第一个是指向字符串的地址,第二个是待查找删除的字符。
下面是程序体:
mov edi,pString ; 程序首先将接收到得pString地址保存到edi中
INVOKE Str_length,edi ; 调用Str_length过程求的接收到的pString的长度,长度值会被保存到eax中
cmp eax,0 ; 长度值是否为0?
je L2 ; 如果为零,则跳转到L2,程序结束。
mov ecx,eax ; 如果不为零,则将字符串长度保存到ecx中
dec eax ; eax中的长度值减1
add edi,eax ; 将edi指向字符串pString的最后一个字符
mov al , char ; 将要查找删除的字符保存到al中
std ; ESI和EDI将在执行字符串指令时自动减少,并且寻址顺序是由高到低
repe scasb ; 没看懂
jne L1 ; 没看懂
dec edi ; 没看懂
L1: mov BYTE PTR [edi+2],0 ; 没看懂
L2: ret
后面代码没看懂,始终不明白为什么要将edi指向最后一个字符,后面的那些操作也不清楚。
发表评论
-
IA-32处理器内存管理学习总结?
2009-10-23 14:58 1332内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2262本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1801本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2181来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2580内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言32位控制台读取用户输入字符程序代码分析(17)
2009-10-22 15:00 4099来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1795来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言醉汉走路代码分析(15)
2009-10-22 10:50 1314来自于《Intel汇编语言 ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2135代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1891来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4177来自于《Intel汇编 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2179来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1565来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3699来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 998215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1405来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1189来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言AAA指令多字节加法代码分析(5)
2009-10-18 10:44 4347来自于《Intel汇编语言程序设计》(第五版)第七章的代 ... -
汇编语言表格驱动分支选择代码分析(4)
2009-10-16 14:48 1455来自于《Intel汇编语言程序设计》(第四版)第六章。 ... -
汇编语言数组中查找正数代码分析(3)
2009-10-15 16:54 1306《Intel汇编语言程序 ...
相关推荐
用汇编语言将字符串中的字母和数字分开存储
用汇编语言实现,输入一个字符串,然后检索数字,并去掉 用汇编语言实现,输入一个字符串,然后检索数字,并去掉 用汇编语言实现,输入一个字符串,然后检索数字,并去掉 用汇编语言实现,输入一个字符串,然后检索...
以下几句是实现依次输入找到的字符串的位置 lea di,str1; l4: ;loopz l5. ;mov cl,[di] mov dl,byte ptr [di] cmp dl,0 jz l5 add dl,30h mov ah,02h int 21h mov dl,',' mov ah,02h int 21h inc ...
8086汇编语言写的统计键盘输入的字符串各字符的频度,字符包含整个ASCII表。
汇编语言开发,实现两个字符串的输入,然后进行字符串的比较,是否在第二个字符串中还有第一个字符串
使用汇编语言,输入字符串,统计其总字符数、字母数、数字数、其他数并输出 将字符串输入后,每一位取出比较判断是什么类型的字符,然后对应字符计数器加1,循环结束输出个字符计数器数目与 数组总长 统计字符数
32位 保护模式汇编语言 翻转字符串 源代码 .asm
利用汇编语言写成的程序 最高支持输入20位任意字符串,并且统计这一串字符串里的数字,大写字母,小写字母,特殊符号的个数 这是一个简单的程序,是学生党学完自己写的,请多多包涵。
使用x86汇编语言编写的文本文件字符串查找与替换程序源码,内附详细程序设计和使用说明
汇编实现的字符串处理程序,输入一串字符,计算出其中含的字母,数字,其他字符个数,希望对大家有所帮助~~
汇编实现逆向复制字符串 汇编实现逆向复制字符串 汇编实现逆向复制字符串 汇编课后答案
在课程的最后,进行了一次课程设计,用汇编编写了一个字符串的比较代码
汇编语言查找匹配字符串 汇编语言写的源代码
编完整程序,利用DOS系统功能调用,从键盘输入一个字符串,并将该字符串从屏幕上换行后输出。
用汇编语言写的比较字符串大小的源代码,加实验报告,实验报告可是本人亲自撰写的,代码绝对可以运行!!自己上汇编实验课写的。
当输入字符串时,系统会根据汇编显示他们的ASCII码值,并且界面友好
回文串是从左到右读与从右到左读字符方式一样的一个字符串,如ABCBA、eluparcettecrapule是回文串,但123431不是回文串。 编一个程序判断一个串是否为回文串。 键盘输入一个以回车结尾的字符串STR,如果是回文串,...
从键盘输入若干个字符串(5~15个),每一串的长度不超过20个字符,请将它们做升序排序并在屏幕上显示。编程要求:Enter键结束一个字串的输入,连续两个Enter键结束整个字串的输入。人机对话输入数据,界面友好,容错...
汇编语言编写的字符串反转程序,有简单注释,专门给学生党过作业
用汇编语言求字符串中非字母个数 字符串的输入和结果的输出都要有必要的提示,且提示独占一行。要使用到子程序。