兰陵月 发表于 2016-12-22 18:54:24

写一个程序:滤去某个字符串中的空格符号。字符串以0结尾。

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

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

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

;程序名:TT328.ASM
;功能:写一个程序,滤去某个字符串中的空格符号(ASCII码20H)。设字符串已0结尾。
ASSUME        CS:CSEG,DS:DSEG
;数据段
DSEGSEGMENT
ZFC_CHAR1DB "li HaIl !N# c&-FJ% 3y(=H!n@ ",0;这是我本人假设的字符串。
ZFC_CHAR2DB ?
DSEGENDS
;代码段
CSEGSEGMENT
START:MOVAX,DSEG
          MOVDS,AX
          MOVBX,OFFSET ZFC_CHAR1
          MOVSI,OFFSET ZFC_CHAR2                               
JX:   MOVAL,
          CMPAL,0
          JZ   OK
          CMPAL,20H
          JZ   NEXT
          MOVDS:,AL
          INCSI                               
NEXT:   INCBX
          JMPJX                               
OK:   MOVAX,4C00H
          INT21H
CSEGENDS
      ENDSTART

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

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

调试情况如下:


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


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

请高手帮我分析分析~~我还不得其手~~

兰陵月 发表于 2016-12-22 19:10:32

@jun @康小泡 @~风介~ @人造人 @西电图图 @不二如是 @liaoluo

呼叫各路大神~~~撸啊~~~撸啊~~~~撸啊~~~

人造人 发表于 2016-12-22 22:06:52


;程序名: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:
        MOVAX, DSEG
        MOVDS, AX
        MOVBX, OFFSET ZFC_CHAR1
        MOVSI, OFFSET ZFC_CHAR2
JX:
        MOVAL,
        inc bx
       
        CMPAL, 0
        JZ   OK
        CMPAL, ' ' ; 直接使用空格不好吗
        JZ   NEXT
       
        MOVDS:, AL
        INCSI
NEXT:
        JMPJX
OK:
        MOVAX, 4C00H
        INT21H
CSEG ENDS
END START

兰陵月 发表于 2016-12-23 08:14:52

本帖最后由 兰陵月 于 2016-12-23 08:38 编辑

人造人 发表于 2016-12-22 22:06


原因是什么??原因是什么??原因是什么??

~风介~ 发表于 2016-12-23 09:57:53

用Python/C我都会,汇编不会~{:10_277:}

兰陵月 发表于 2016-12-23 10:38:24

~风介~ 发表于 2016-12-23 09:57
用Python/C我都会,汇编不会~

{:10_266:}{:10_266:}{:10_266:}

人造人 发表于 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

;代码段
CSEGSEGMENT
START:MOVAX,DSEG
          MOVDS,AX
          MOVBX,OFFSET ZFC_CHAR1
          MOVSI,OFFSET ZFC_CHAR2                              
JX:   MOVAL,
          CMPAL,0
          JZ   OK
          CMPAL,20H
          JZ   NEXT
          MOVDS:,AL
          INCSI                              
NEXT:   INCBX
          JMPJX                              
OK:   MOVAX,4C00H
          INT21H
CSEGENDS

;数据段
DSEGSEGMENT
ZFC_CHAR1DB "li HaIl !N# c&-FJ% 3y(=H!n@ ",0;这是我本人假设的字符串。
ZFC_CHAR2DB ?
DSEGENDS

      ENDSTART
      

兰陵月 发表于 2016-12-24 04:22:01

看出来了,我还是水平太差啊,多谢多谢

zealstar 发表于 2016-12-24 06:18:36

兰陵月 发表于 2016-12-24 04:22
看出来了,我还是水平太差啊,多谢多谢

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

让BX == SI,当BX自增的时候,SI也同样自增也同样执行写入DS:的动作。但如果检测到空格,SI就不自增了,只有BX自增,一样还是写入DS:就行,此时si就比bx少1,如果检测到第二个空格,si就比bx少2依次类推

兰陵月 发表于 2016-12-24 20:29:01

zealstar 发表于 2016-12-24 06:18
感觉不需要第二个字符段的空间啊,回存到原字符段的地址里就好了,滤过空格而已。

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

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

如果写入原地址,是不会出现这些问题的。
页: [1]
查看完整版本: 写一个程序:滤去某个字符串中的空格符号。字符串以0结尾。