鱼C论坛

 找回密码
 立即注册
查看: 8108|回复: 9

[技术交流] 写一个程序:滤去某个字符串中的空格符号。字符串以0结尾。

[复制链接]
发表于 2016-12-22 18:54:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 兰陵月 于 2016-12-22 19:07 编辑

题3.28  写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
(我简化了一下,直接把滤去空格后的字符串放在另一个地址中)


题目来自《80X86汇编语言程序设计教程》(杨季文 等编著  钱培德 审)第109页题目3.28

  1. ;程序名:TT328.ASM
  2. ;功  能:写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
  3. ASSUME        CS:CSEG,DS:DSEG
  4. ;数据段
  5. DSEG  SEGMENT
  6.   ZFC_CHAR1  DB "li HaIl !N# c&-FJ% 3y(=H!n@ ",0  ;这是我本人假设的字符串。
  7.   ZFC_CHAR2  DB ?
  8. DSEG  ENDS
  9. ;代码段
  10. CSEG  SEGMENT
  11.   START:  MOV  AX,DSEG
  12.           MOV  DS,AX
  13.           MOV  BX,OFFSET ZFC_CHAR1
  14.           MOV  SI,OFFSET ZFC_CHAR2                               
  15.   JX:     MOV  AL,[BX]
  16.           CMP  AL,0
  17.           JZ   OK
  18.           CMP  AL,20H
  19.           JZ   NEXT
  20.           MOV  DS:[SI],AL
  21.           INC  SI                               
  22.   NEXT:   INC  BX
  23.           JMP  JX                               
  24.   OK:     MOV  AX,4C00H
  25.           INT  21H
  26. CSEG  ENDS
  27.       END  START
复制代码


当假设的字符串中字符个数<=23个时,程序运行正确。

当假设的字符串中字符个数>23时,程序运行不正确,死机~

调试情况如下:

211.jpg
上图中当复制完非空格的字符“%”(图中1和2处)之后,程序中出现莫名其妙的语句(图中第3处)。

212.jpg
上图是继续多次按T之后出现的情况。
图中1和2的语句经常发生变化,第1处的语句:ADD  AX,数字,这个数字每次都发生变化。其他不变。
第2处的是整句都发生随机变化~。


请高手帮我分析分析~~我还不得其手~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-22 19:10:32 | 显示全部楼层
@jun @康小泡 @~风介~ @人造人 @西电图图 @不二如是 @liaoluo

呼叫各路大神~~~撸啊~~~撸啊~~~~撸啊~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-22 22:06:52 | 显示全部楼层
无标题.png
  1. ;程序名:TT328.ASM
  2. ;功  能:写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
  3. ASSUME CS:CSEG, DS:DSEG

  4. ;数据段
  5. DSEG SEGMENT

  6.         ZFC_CHAR1 DB "li HaIl !N# c&-FJ% 3y(=H!n@ ", 0  ;这是我本人假设的字符串。
  7.         ZFC_CHAR2 DB "                            " ; 这下就可以了

  8. DSEG ENDS

  9. ;代码段
  10. CSEG SEGMENT
  11. START:
  12.         MOV  AX, DSEG
  13.         MOV  DS, AX
  14.         MOV  BX, OFFSET ZFC_CHAR1
  15.         MOV  SI, OFFSET ZFC_CHAR2
  16. JX:
  17.         MOV  AL, [BX]
  18.         inc bx
  19.        
  20.         CMP  AL, 0
  21.         JZ   OK
  22.         CMP  AL, ' ' ; 直接使用空格不好吗
  23.         JZ   NEXT
  24.        
  25.         MOV  DS:[SI], AL
  26.         INC  SI
  27. NEXT:
  28.         JMP  JX
  29. OK:
  30.         MOV  AX, 4C00H
  31.         INT  21H
  32. CSEG ENDS
  33. END START
复制代码

评分

参与人数 2荣誉 +8 鱼币 +10 贡献 +3 收起 理由
兰陵月 + 5 + 5 + 3 热爱鱼C^_^
~风介~ + 3 + 5 支持楼主!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-23 08:14:52 | 显示全部楼层
本帖最后由 兰陵月 于 2016-12-23 08:38 编辑


原因是什么??原因是什么??原因是什么??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-23 09:57:53 | 显示全部楼层
用Python/C我都会,汇编不会~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-23 10:38:24 | 显示全部楼层
~风介~ 发表于 2016-12-23 09:57
用Python/C我都会,汇编不会~

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-23 12:27:12 | 显示全部楼层
兰陵月 发表于 2016-12-23 08:14
原因是什么??原因是什么??原因是什么??

真的看不出来吗?
ZFC_CHAR2 DB ?
只有一个字节,超过一个字节就会覆盖不属于 ZFC_CHAR2 的位置
因为data段后面就是code段

这样,程序就可以运行了,不过还是会覆盖不属于 ZFC_CHAR2 的位置,data段后面是什么那?
已经不属于此程序了吧

  1. ;程序名:TT328.ASM
  2. ;功  能:写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
  3. ASSUME        CS:CSEG,DS:DSEG

  4. ;代码段
  5. CSEG  SEGMENT
  6.   START:  MOV  AX,DSEG
  7.           MOV  DS,AX
  8.           MOV  BX,OFFSET ZFC_CHAR1
  9.           MOV  SI,OFFSET ZFC_CHAR2                                
  10.   JX:     MOV  AL,[BX]
  11.           CMP  AL,0
  12.           JZ   OK
  13.           CMP  AL,20H
  14.           JZ   NEXT
  15.           MOV  DS:[SI],AL
  16.           INC  SI                                
  17.   NEXT:   INC  BX
  18.           JMP  JX                                
  19.   OK:     MOV  AX,4C00H
  20.           INT  21H
  21. CSEG  ENDS

  22. ;数据段
  23. DSEG  SEGMENT
  24.   ZFC_CHAR1  DB "li HaIl !N# c&-FJ% 3y(=H!n@ ",0  ;这是我本人假设的字符串。
  25.   ZFC_CHAR2  DB ?
  26. DSEG  ENDS

  27.       END  START
  28.       
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-24 04:22:01 From FishC Mobile | 显示全部楼层
看出来了,我还是水平太差啊,多谢多谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-24 06:18:36 | 显示全部楼层
兰陵月 发表于 2016-12-24 04:22
看出来了,我还是水平太差啊,多谢多谢

感觉不需要第二个字符段的空间啊,回存到原字符段的地址里就好了,滤过空格而已。

让BX == SI,当BX自增的时候,SI也同样自增也同样执行写入DS:[SI]的动作。但如果检测到空格,SI就不自增了,只有BX自增,一样还是写入DS:[SI]就行,此时si就比bx少1,如果检测到第二个空格,si就比bx少2依次类推
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-24 20:29:01 | 显示全部楼层
zealstar 发表于 2016-12-24 06:18
感觉不需要第二个字符段的空间啊,回存到原字符段的地址里就好了,滤过空格而已。

让BX == SI,当BX自 ...

是的,原题目的意思就是写入原地址,我只是稍微改了下。

如果写入原地址,是不会出现这些问题的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-4 07:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表