写一个程序:滤去某个字符串中的空格符号。字符串以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处的是整句都发生随机变化~。
请高手帮我分析分析~~我还不得其手~~ @jun @康小泡 @~风介~ @人造人 @西电图图 @不二如是 @liaoluo
呼叫各路大神~~~撸啊~~~撸啊~~~~撸啊~~~
;程序名: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:38 编辑
人造人 发表于 2016-12-22 22:06
原因是什么??原因是什么??原因是什么?? 用Python/C我都会,汇编不会~{:10_277:} ~风介~ 发表于 2016-12-23 09:57
用Python/C我都会,汇编不会~
{:10_266:}{:10_266:}{:10_266:} 兰陵月 发表于 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
看出来了,我还是水平太差啊,多谢多谢
感觉不需要第二个字符段的空间啊,回存到原字符段的地址里就好了,滤过空格而已。
让BX == SI,当BX自增的时候,SI也同样自增也同样执行写入DS:的动作。但如果检测到空格,SI就不自增了,只有BX自增,一样还是写入DS:就行,此时si就比bx少1,如果检测到第二个空格,si就比bx少2依次类推 zealstar 发表于 2016-12-24 06:18
感觉不需要第二个字符段的空间啊,回存到原字符段的地址里就好了,滤过空格而已。
让BX == SI,当BX自 ...
是的,原题目的意思就是写入原地址,我只是稍微改了下。
如果写入原地址,是不会出现这些问题的。
页:
[1]