这几天才有空好好看看宏汇编,大学的时候学过,可是当时是个老教授教的,还是东南大学的,说话没有一个词能听的懂得,方言太重了,现在,在公司有时间,因为刚刚做完一个项目,可以休息一下,正好可以看看。
今天才把MASM.exe,和link.exe这两个程序搞明白怎么用的,可以到我的博客里面下,并且使用方法也有,
还有我用的书是清华大学的《IBM PC汇编语言程序设计实验教程》,这个也可以在我的博客里面可以找到的,这本书真的是非常的好,我建议大家好好看看。可能PDF文档不是太清楚。
今天一天就调试成功了一个程序,是书上的第一个程序,代码如下:
;================================================================
DATA SEGMENT para 'data_prama'
;添加数据区数据
;打印输出信息,提示输入编号
sel_messg DB 'Please input number:',13,10,'$'
;保存输入的信息
stor_input LABEL BYTE
MAX DB 3
IN_CNT DB ?
IN_TXT DB 3 DUP(?)
;商品信息
DUCT_MESSG DB '01',' A '
DB '02',' B '
DB '03',' C '
DB '04',' D '
DB '05',' E '
DB '06',' F '
;查找结果信息
RESLUT DB 5 DUP(20H),13,10,'$'
NO_DUCT DB 'NO SUCH PRODUCT!!',13,10,'$'
DATA ENDS
;==================================================================
STACK SEGMENT
;添加堆栈区的数据
STACK ENDS
;=================================================
CODE SEGMENT para 'code_prama'
;添加代码区数据
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN proc FAR
;-------------------------
;初始化
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
;-------------------------
START:
LEA DX,sel_messg
MOV AH,09H
INT 21H
LEA DX,stor_input
MOV AH,0AH
INT 21H
CMP IN_CNT,0
JE EXIT
MOV AL,IN_TXT
MOV AH,IN_TXT+1
MOV CX,06H
LEA SI,DUCT_MESSG
A20:
CMP AX,WORD PTR[SI]
JE A30
ADD SI, 5
LOOP A20
LEA DX,NO_DUCT
MOV AH,09H
INT 21H
JMP EXIT
A30:
MOV CX, 5
LEA DI, RESLUT
REP MOVSB
LEA DX,RESLUT
MOV AH,09H
INT 21H
JMP START
EXIT:
RET
MAIN ENDP
CODE ENDS
END MAIN
在写这个程序的过程中,老是出现问题,后来才发觉在调用INT 21H的时候,把AH都写成了AX,SI和DI的使用要非常的小心,一不小心就要出错.
还有就是好像INT 21H所用到的地址都是有效地址,并不是物理地址。