汇编语言 把下面这个程序每条指令加注释,尽量的详细
1个回答
展开全部
CRLF MACRO;定义宏
MOV DL,0DH;调用DOS中断字符输出,输出字符ASCLL是0DH,即换行符
MOV AH,02H;中断功能号02H
INT 21H;DOS中断,21H
MOV DL,0AH;调用DOS中断字符输出,输出字符ASCLL是0AH,即回车
MOV,AH,02H;中断功能号02H
INT 21H;;DOS中断,21H
ENDM ;宏定义结束
DATA SEGMENT ;数据段
DATA1 DB 33H,39H,31H,37H,34H
DATA2 DB 36H,35H,30H,38H,32H
DATA ENDS;数据段结束
STACK SEGMENT堆栈段
STA DB 20 DUP(?)
TOP EQU LENGTH STA ;预定义TOP为STA的长度
STACK ENDS;堆栈段结束
CODE SEGMENT;代码段
ASSUME CS:CODE,DS:STACK,ES:DATA ;指定相关段
START: MOV AX,DATA;把DATA段的段地址赋予AX
MOV DS,AX;通过AX把DATA段地址赋予DS
MOV AX,STACK;把STACK段的段地址赋予AX
MOV SS,AX;通过AX把STACK段地址赋予SS
MOV AX,TOP;把TOP赋予AX
MOV SP,AX;把AX的值赋予栈指针,即让SP指向堆栈段段尾
MOV SI,OFFSET DATA2;把变量DATA2的偏移地址赋予SI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV SI,OFFSET DATA1;把变量DATA1的偏移地址赋予SI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV DI,OFFSET DATA2;把变量DATA2的偏移地址赋予DI
CALL ADDA;调用子程序ADDA
MOV SI,OFFSET DATA1;把变量DATA1的偏移地址赋予DI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV AX,4C00H ;准备调用DOS终端结束程序,功能号4CH,返回值0
INT 21H;调用DOS中断
DISPL PROC NEAR ;子程序DISPL
DS1:MOV AH,02 ;准备调用DOS中断,功能好02,即字符输出
MOV DL,[SI+BX-1];字符的ASCLL代码在[SI+BX-1]中
INT 21H;调用中断
DEC BX;BX值减1
JNZ DS1;条件跳转到DS1,即重复5次
RET;子程序返回
DISPL ENDP;子程序结束
ADDA PROC NEAR;子程序NEAR
MOV DX,SI;SI值赋予DI
MOV BP,DI;DI值赋予BP
MOV BX,05;把BX赋值为05
AD1:SUB BYTE PTR[SI+BX-1],30H;[SI+BX-1]中的数值减30H
SUB BYTE PTR[DI+BX-1],30H;[DI+BX-1]中的数值减30H
DEC BX ;BX值减1
JNZ AD1;条件跳转,即循环5次
MOV SI,DX;把DX的值赋予SI
MOV DI,BP;把BP的值赋予DI
MOV CX,05;把CX赋值为05
CLC;CF标识符清零
AD2: MOV AL,[SI];把[SI]中的值赋予AL
MOV BL,[DI];把[DI]中的值赋予BL
ADC AL,BL;AL=AL+BL
AAA;非压缩BCD码调整
MOV [SI],AL;AL的值赋予[SI]
INC SI;SI=SI+1
INC DI;DI=DI+1
LOOP AD2;循环跳转AD2
MOV SI,DX;SI赋值为DX的值
MOV DI,BP;DI赋值为BP的值
MOV BX,05;BX赋值为05
AD3:ADD BYTE PTR[SI+BX-1],30H;[SI+BX-1]中的数值加30H
ADD BYTE PTR[DI+BX-1],30H;[DI+BX-1]中的数值加30H
DEC BX;BX=BX-1
JNZ AD3;条件跳转到AD3
RET;子程序返回
ADDA ENDP;子程序结束
CODE ENDS;代码段结束
END START;程序结束
MOV DL,0DH;调用DOS中断字符输出,输出字符ASCLL是0DH,即换行符
MOV AH,02H;中断功能号02H
INT 21H;DOS中断,21H
MOV DL,0AH;调用DOS中断字符输出,输出字符ASCLL是0AH,即回车
MOV,AH,02H;中断功能号02H
INT 21H;;DOS中断,21H
ENDM ;宏定义结束
DATA SEGMENT ;数据段
DATA1 DB 33H,39H,31H,37H,34H
DATA2 DB 36H,35H,30H,38H,32H
DATA ENDS;数据段结束
STACK SEGMENT堆栈段
STA DB 20 DUP(?)
TOP EQU LENGTH STA ;预定义TOP为STA的长度
STACK ENDS;堆栈段结束
CODE SEGMENT;代码段
ASSUME CS:CODE,DS:STACK,ES:DATA ;指定相关段
START: MOV AX,DATA;把DATA段的段地址赋予AX
MOV DS,AX;通过AX把DATA段地址赋予DS
MOV AX,STACK;把STACK段的段地址赋予AX
MOV SS,AX;通过AX把STACK段地址赋予SS
MOV AX,TOP;把TOP赋予AX
MOV SP,AX;把AX的值赋予栈指针,即让SP指向堆栈段段尾
MOV SI,OFFSET DATA2;把变量DATA2的偏移地址赋予SI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV SI,OFFSET DATA1;把变量DATA1的偏移地址赋予SI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV DI,OFFSET DATA2;把变量DATA2的偏移地址赋予DI
CALL ADDA;调用子程序ADDA
MOV SI,OFFSET DATA1;把变量DATA1的偏移地址赋予DI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV AX,4C00H ;准备调用DOS终端结束程序,功能号4CH,返回值0
INT 21H;调用DOS中断
DISPL PROC NEAR ;子程序DISPL
DS1:MOV AH,02 ;准备调用DOS中断,功能好02,即字符输出
MOV DL,[SI+BX-1];字符的ASCLL代码在[SI+BX-1]中
INT 21H;调用中断
DEC BX;BX值减1
JNZ DS1;条件跳转到DS1,即重复5次
RET;子程序返回
DISPL ENDP;子程序结束
ADDA PROC NEAR;子程序NEAR
MOV DX,SI;SI值赋予DI
MOV BP,DI;DI值赋予BP
MOV BX,05;把BX赋值为05
AD1:SUB BYTE PTR[SI+BX-1],30H;[SI+BX-1]中的数值减30H
SUB BYTE PTR[DI+BX-1],30H;[DI+BX-1]中的数值减30H
DEC BX ;BX值减1
JNZ AD1;条件跳转,即循环5次
MOV SI,DX;把DX的值赋予SI
MOV DI,BP;把BP的值赋予DI
MOV CX,05;把CX赋值为05
CLC;CF标识符清零
AD2: MOV AL,[SI];把[SI]中的值赋予AL
MOV BL,[DI];把[DI]中的值赋予BL
ADC AL,BL;AL=AL+BL
AAA;非压缩BCD码调整
MOV [SI],AL;AL的值赋予[SI]
INC SI;SI=SI+1
INC DI;DI=DI+1
LOOP AD2;循环跳转AD2
MOV SI,DX;SI赋值为DX的值
MOV DI,BP;DI赋值为BP的值
MOV BX,05;BX赋值为05
AD3:ADD BYTE PTR[SI+BX-1],30H;[SI+BX-1]中的数值加30H
ADD BYTE PTR[DI+BX-1],30H;[DI+BX-1]中的数值加30H
DEC BX;BX=BX-1
JNZ AD3;条件跳转到AD3
RET;子程序返回
ADDA ENDP;子程序结束
CODE ENDS;代码段结束
END START;程序结束
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询