汇编语言 把下面这个程序每条指令加注释,尽量的详细
CRLFMACROMOVDL,0DHMOVAH,02HINT21HMOVDL,0AHMOV,AH,02HINT21HENDMDATASEGMENTDATA1DB33H,3...
CRLF MACRO
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV,AH,02H
INT 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
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:STACK,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV SI,OFFSET DATA2
MOV BX,05
CALL DISPL
CRLF
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL
CRLF
MOV DI,OFFSET DATA2
CALL ADDA
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL
CRLF
MOV AX,4C00H
INT 21H
DISPL PROC NEAR
DS1:MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1:SUB BYTE PTR[SI+BX-1],30H
SUB BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL
AAA
MOV [SI],AL
INC SI
INC DI
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,05
AD3:ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD3
RET
ADDA ENDP
CODE ENDS
END START 展开
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV,AH,02H
INT 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
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:STACK,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV SI,OFFSET DATA2
MOV BX,05
CALL DISPL
CRLF
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL
CRLF
MOV DI,OFFSET DATA2
CALL ADDA
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL
CRLF
MOV AX,4C00H
INT 21H
DISPL PROC NEAR
DS1:MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
ADDA PROC NEAR
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1:SUB BYTE PTR[SI+BX-1],30H
SUB BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL
AAA
MOV [SI],AL
INC SI
INC DI
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,05
AD3:ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD3
RET
ADDA ENDP
CODE ENDS
END START 展开
3个回答
展开全部
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;程序结束
展开全部
CRLF MACRO ;定义宏,功能上光标指向下一行
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV,AH,02H
INT 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
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:STACK,ES:DATA
START: MOV AX,DATA ;程序开始,将DATA的段地址赋给DS
MOV DS,AX
MOV AX,STACK ;将STACK的短地址赋给SS
MOV SS,AX
MOV AX,TOP ;SP指向栈顶
MOV SP,AX
MOV SI,OFFSET DATA2 ;SI指向DATA2的偏移地址
MOV BX,05
CALL DISPL ;调用子程序DISPL
CRLF ;宏调用
MOV SI,OFFSET DATA1 ;SI指向DATA1的偏移地址
MOV BX,05
CALL DISPL ;调用子程序DISPL
CRLF ;宏调用
MOV DI,OFFSET DATA2 ;DI指向DATA2的偏移地址
CALL ADDA ;调用子程序ADDA,此时,SI指向DATA1的偏移地址,DI指向DATA2的偏移地址
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL ;调用子程序DISPL
CRLF
MOV AX,4C00H ;软中断
INT 21H
DISPL PROC NEAR ;定义子程序DISPL,功能是将数组中的数顺序反过来输出
DS1:MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
ADDA PROC NEAR ;定义子程序ADDA,作用是将两数组中的数对应相加,并将结果转化成ASCII码表示。应该是为了后面调用DISPL将其十进制输出
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1:SUB BYTE PTR[SI+BX-1],30H ;将数组中的数减30H
SUB BYTE PTR[DI+BX-1],30H ;同上
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC ;进位标志CF清零
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL ;将数组中对应的数相加
AAA ;将运算结果调整为非压缩十进制数
MOV [SI],AL ;将AL存到SI所指向的数组中
INC SI
INC DI
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,05
AD3:ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD3
RET
ADDA ENDP
CODE ENDS
END START
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV,AH,02H
INT 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
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:STACK,ES:DATA
START: MOV AX,DATA ;程序开始,将DATA的段地址赋给DS
MOV DS,AX
MOV AX,STACK ;将STACK的短地址赋给SS
MOV SS,AX
MOV AX,TOP ;SP指向栈顶
MOV SP,AX
MOV SI,OFFSET DATA2 ;SI指向DATA2的偏移地址
MOV BX,05
CALL DISPL ;调用子程序DISPL
CRLF ;宏调用
MOV SI,OFFSET DATA1 ;SI指向DATA1的偏移地址
MOV BX,05
CALL DISPL ;调用子程序DISPL
CRLF ;宏调用
MOV DI,OFFSET DATA2 ;DI指向DATA2的偏移地址
CALL ADDA ;调用子程序ADDA,此时,SI指向DATA1的偏移地址,DI指向DATA2的偏移地址
MOV SI,OFFSET DATA1
MOV BX,05
CALL DISPL ;调用子程序DISPL
CRLF
MOV AX,4C00H ;软中断
INT 21H
DISPL PROC NEAR ;定义子程序DISPL,功能是将数组中的数顺序反过来输出
DS1:MOV AH,02
MOV DL,[SI+BX-1]
INT 21H
DEC BX
JNZ DS1
RET
DISPL ENDP
ADDA PROC NEAR ;定义子程序ADDA,作用是将两数组中的数对应相加,并将结果转化成ASCII码表示。应该是为了后面调用DISPL将其十进制输出
MOV DX,SI
MOV BP,DI
MOV BX,05
AD1:SUB BYTE PTR[SI+BX-1],30H ;将数组中的数减30H
SUB BYTE PTR[DI+BX-1],30H ;同上
DEC BX
JNZ AD1
MOV SI,DX
MOV DI,BP
MOV CX,05
CLC ;进位标志CF清零
AD2: MOV AL,[SI]
MOV BL,[DI]
ADC AL,BL ;将数组中对应的数相加
AAA ;将运算结果调整为非压缩十进制数
MOV [SI],AL ;将AL存到SI所指向的数组中
INC SI
INC DI
LOOP AD2
MOV SI,DX
MOV DI,BP
MOV BX,05
AD3:ADD BYTE PTR[SI+BX-1],30H
ADD BYTE PTR[DI+BX-1],30H
DEC BX
JNZ AD3
RET
ADDA ENDP
CODE ENDS
END START
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序要完成的功能很简单,就是将用ASCII码定义的两串数字39174+65082,结果还是用十进制的形式显示在屏幕上。
程序结构是主程序调用显示子程序DISPL、加法计算子程序ADDA的形式完成的。
程序结构是主程序调用显示子程序DISPL、加法计算子程序ADDA的形式完成的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询