汇编语言问题.新手求助.

题目是求一个串中数字字符的个数.下面是代码,错误貌似很多:

DATAS SEGMENT
STRING DW 'I09E3SOS','$' ;error A2084:constant value too large
A1 DW '0','1','2','3','4','5','6','7','8','9'
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
XOR SI,SI
MOV CX,27
MOVSB AX,STRING ;error A2070:invalid instruction operands
LEA BX,A1
L2:SCASB AX ;error A2070:invalid instruction operands
MOV DX,10
L3:CMPSB AX,[BX] ;error A2070:invalid instruction operands
JZ L1
INC BX
DEC DX
JNZ L3
L1:INC SI
DEC CX
JNZ L2
LEA DX,STRING
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START

回答的全面给加分

我用自己的话来给你说吧,汇编语言呢 就算是一个程序员的内功吧,你可以不学汇编语言直接去学习高级语言比如前面朋友回答的VB。关键是看你自己怎么定位了。现在我在回答你的问题 不知道从哪里入手,其实去书店买一本书回来看就OK了 清华大学王爽的那本很不错 不过很多书店不容易买到 其实哪本都一样
买书最大的好处就是可以随时标记重点,不知哪里入手那就按照顺序 先看看进制转换,熟练掌握尤其是补码的表示方法,然后就是7条寻址方式,在就是指令系统,等这前三章学完以后简单的程序你也可以看懂百分之70了 后面就是经验和时间的积累了,如果你真是非常想学好汇编语言,最起码可以每天坚持1个小时学习汇编的话,我可以加你进我的汇编群里。群里人不多 只谈汇编问题 不聊天
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-27
STRING DW 'I09E3SOS','$' ;error A2084:constant value too large
A1 DW '0','1','2','3','4','5','6','7','8','9'

像'0','1','2','3','4','5','6','7','8','9'这样的ascii码,用一个字节就可以表示了,而dw是define word的意思,是用来定义一个word,2个字节的,所以不对。
而定义一个字节用的是db, define byte
所以正确的定义数据应该像这样:
STRING db 'I09E3SOS','$'
A1 db '0','1','2','3','4','5','6','7','8','9'追问

我已经改正了,但是问题好象不出在这里,说是MOVSB,SCASB,CMPSB后面的操作数无效.

追答

movsb, scasb, cmpsb是不需要操作数的。

追问

书上写得实在是不清楚,再追问一下,这个程序应该怎么改正呢?

追答

我改成了不用串指令的,
DATAS SEGMENT
STRING Db 'I09E3SOS','$'
A1 Db '0','1','2','3','4','5','6','7','8','9'
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS

START:
MOV AX,DATAS
MOV DS,AX

mov ah, 0 ; 数字字符个数计数器,初始设为0
lea bx, STRING

checkLoop:
mov al, [bx]
cmp al, '$' ; 到了字符串结尾了没?
je over ;到了

cmp al, '0' ; 是数字字符不:在'0'-'9'范围不?
jb next
cmp al, '9'
ja next

; 是数字字符
inc ah

next:
inc bx
jmp checkLoop

over:
; 此时ah的值就是数字字符的个数

LEA DX,STRING
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODES ENDS
END START

本回答被提问者采纳
相似回答