鱼C论坛

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

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

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

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

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

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

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


题目来自《80X86汇编语言程序设计教程》(杨季文 等编著  钱培德 审)第109页题目3.28
;程序名:TT328.ASM
;功  能:写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
ASSUME        CS:CSEG,DS:DSEG
;数据段
DSEG  SEGMENT
  ZFC_CHAR1  DB "li HaIl !N# c&-FJ% 3y(=H!n@ ",0  ;这是我本人假设的字符串。
  ZFC_CHAR2  DB ?
DSEG  ENDS
;代码段
CSEG  SEGMENT
  START:  MOV  AX,DSEG
          MOV  DS,AX
          MOV  BX,OFFSET ZFC_CHAR1
          MOV  SI,OFFSET ZFC_CHAR2                                
  JX:     MOV  AL,[BX]
          CMP  AL,0
          JZ   OK
          CMP  AL,20H
          JZ   NEXT
          MOV  DS:[SI],AL
          INC  SI                                
  NEXT:   INC  BX
          JMP  JX                                
  OK:     MOV  AX,4C00H
          INT  21H
CSEG  ENDS
      END  START

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

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

调试情况如下:

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

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


请高手帮我分析分析~~我还不得其手~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

呼叫各路大神~~~撸啊~~~撸啊~~~~撸啊~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

;数据段
DSEG SEGMENT

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

DSEG ENDS

;代码段
CSEG SEGMENT
START:
        MOV  AX, DSEG
        MOV  DS, AX
        MOV  BX, OFFSET ZFC_CHAR1
        MOV  SI, OFFSET ZFC_CHAR2
JX:
        MOV  AL, [BX]
        inc bx
        
        CMP  AL, 0
        JZ   OK
        CMP  AL, ' ' ; 直接使用空格不好吗
        JZ   NEXT
        
        MOV  DS:[SI], AL
        INC  SI
NEXT:
        JMP  JX
OK:
        MOV  AX, 4C00H
        INT  21H
CSEG ENDS
END START

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


原因是什么??原因是什么??原因是什么??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-23 09:57:53 | 显示全部楼层
用Python/C我都会,汇编不会~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

这样,程序就可以运行了,不过还是会覆盖不属于 ZFC_CHAR2 的位置,data段后面是什么那?
已经不属于此程序了吧
;程序名:TT328.ASM
;功  能:写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
ASSUME        CS:CSEG,DS:DSEG

;代码段
CSEG  SEGMENT
  START:  MOV  AX,DSEG
          MOV  DS,AX
          MOV  BX,OFFSET ZFC_CHAR1
          MOV  SI,OFFSET ZFC_CHAR2                                
  JX:     MOV  AL,[BX]
          CMP  AL,0
          JZ   OK
          CMP  AL,20H
          JZ   NEXT
          MOV  DS:[SI],AL
          INC  SI                                
  NEXT:   INC  BX
          JMP  JX                                
  OK:     MOV  AX,4C00H
          INT  21H
CSEG  ENDS

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

      END  START
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-24 04:22:01 From FishC Mobile | 显示全部楼层
看出来了,我还是水平太差啊,多谢多谢
想知道小甲鱼最近在做啥?请访问 -> 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依次类推
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

如果写入原地址,是不会出现这些问题的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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