学完了C。烦人的汇编悄悄来到,超多的指令,繁琐的代码,呜呜~~~~
但是又不能不学,所以这里比出来一个计算字符数的程序,大家一起学习.
希望那位老兄能够比点意见,能够学好点汇编啦,谢谢!!!
DATASG SEGMENT
CHARLIST LABEL BYTE
MAX DB 80
ACT DB ?
CHAR DB 80 DUP(?)
LETTER DW 0
DIGIT DW 0
OTHER DW 0
ENTER1 DB 'Please enter charlist:','$'
RESULT DB 'Count Result:','$'
RESULT1 DB 'letter:','$'
RESULT2 DB 'digit:','$'
RESULT3 DB 'other:','$'
DATASG ENDS
CODESG SEGMENT
MAIN PROC FAR
ASSUME CS:CODESG,DS:DATASG
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV LETTER,0
MOV DIGIT,0
MOV OTHER,0
MOV CX,0
LEA DX,ENTER1
MOV AH,09
INT 21H
LEA DX,CHARLIST
MOV AH,0AH
INT 21H
CALL CRLF
LEA SI,CHAR
MOV CL,[SI-1]
COMPARE:
MOV AL,[SI]
CBW
CMP AX,2FH
JLE OTH
CMP AX,39H
JLE DIGI
CMP AX,40H
JLE OTH
CMP AX,5AH
JLE LET
CMP AX,60H
JLE OTH
CMP AX,7AH
JLE LET
JMP OTH
LET:
INC LETTER
JMP CHANGE
OTH:
INC OTHER
JMP CHANGE
DIGI:
INC DIGIT
CHANGE:
INC SI
LOOP COMPARE
LEA DX,RESULT
MOV AH,09H
INT 21H
CALL CRLF
LEA DX,RESULT1
MOV AH,09H
INT 21H
MOV BX,LETTER
CALL BINIHEX
CALL CRLF
LEA DX,RESULT2
MOV AH,09H
INT 21H
MOV BX,DIGIT
CALL BINIHEX
CALL CRLF
LEA DX,RESULT3
MOV AH,09H
INT 21H
MOV BX,OTHER
CALL BINIHEX
CALL CRLF
RET
MAIN ENDP
CRLF PROC NEAR
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
INT 21H
RET
CRLF ENDP
BINIHEX PROC NEAR
MOV CH,4
ROTATE:
MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINTIT
ADD AL,7H
PRINTIT:
MOV DL,AL
MOV AH,02
INT 21H
DEC CH
JNZ ROTATE
MOV DL,48H
INT 21H
RET
BINIHEX ENDP
CODESG ENDS
END START
用C++或者C可以简单实现的一个计数程序要写成这样?你还说不繁啊?
不过最近花了两天时间把成本书看了遍。发觉原来真的想积木一样,简单。呵呵
无非就是各类的寄存器存来存去,但是如果真是要做到结构清晰,思路正确,还有待下更多的功夫.