汇编语言 把下面这个程序每条指令加注释,尽量的详细

作者&投稿:徵叛 (若有异议请与网页底部的电邮联系)
汇编语言 把下面这个程序每条指令加注释,尽量的详细~

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;程序结束

ORG 0000H
MOV A, #12 ;立即寻址,两个字节,一个机器周期
MOV B, #0BH ;立即寻址,三个字节,两个机器周期
END

共占用 5 个字节空间。
共需要 3 个机器周期。6个微秒(假设单片机晶振为6MHZ)。

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;程序结束

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

程序要完成的功能很简单,就是将用ASCII码定义的两串数字39174+65082,结果还是用十进制的形式显示在屏幕上。
程序结构是主程序调用显示子程序DISPL、加法计算子程序ADDA的形式完成的。


大石桥市18741205986: 汇编语言 把下面这个程序每条指令加注释,尽量的详细 -
符胃二乙: CRLF MACRO;定义宏MOV DL,0DH;调用DOS中断字符输出,输出字符ASCLL是0DH,即换行符MOV AH,02H;中断功能号02HINT 21H;DOS中断,21HMOV DL,0AH;调用DOS中断字符输出,输出字符ASCLL是0AH,即回车MOV,...

大石桥市18741205986: 用汇编语言编写一个程序1*1+2*2+……+10*10.急用,,会的人麻烦你帮我一下,谢谢了 -
符胃二乙:assume cs:code,ds:data data segment OUTPUT db '1*1+2*2+......+N*N=','$' TIME dw 0AH ;0AH(...

大石桥市18741205986: 把下面 简单 汇编程序 加上详细注释
符胃二乙: program segment main proc far assume cs:program start:push ds ;这三条指令是为了能正确返回操作系统 sub ax,ax push ax input:mov ah,01 ;调用中断从键盘输入一个字符,字符的ASCII码在AL中 ;mov ah,07 int 21h cmp al,'q' ;比较输入的字...

大石桥市18741205986: 汇编语言 请用一条汇编指令完成如下功能 -
符胃二乙: 是一条指令完成1: 2:的所有功能 (这个不可能实现) 所以,我猜应该是1: 一条指令2: 一条指令1: ADD AX,DX2: ADD BYTE PTR [3B21H],CL

大石桥市18741205986: 汇编语言程序设计的两道题1.执行一条段内RET指令后,应完成的操作是( ) .A.SP指针加2,然后从堆栈中弹出两个字节内容B.从堆栈中弹出两个字节的... -
符胃二乙:[答案] 把你解答下这两个题目:1、选B,子程序的RET指令就是先要把堆栈中原来入栈的地址给弹出来,也就是主程序中得调用子程序中得下一指令,然后堆栈指针SP加2,注意栈地址是栈底地址最大,越上越小.2、(1)DS:DATA ,CS:...

大石桥市18741205986: 求单片机总汇编语言指令表、 - --- -
符胃二乙: 编号 指令名称 指令助记符 指令说明 数据传送类指令 1 一般传送 MOV A, #data 将立即数#data送累加器A 2 MOV direct, #data 将立即数#data送片内RAM direct地址单元内 3 Mov Rn, #data 将立即数#data送寄存器Rn 4 Mov @Ri, #data 寄存器Ri内...

大石桥市18741205986: 写一个汇编语言程序,完成100以内十进制数相加运算. -
符胃二乙: 1.现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=0B7H,(21203H)=65H,是说明下面各条指令执行完之后AX寄存器中的内容 MOV AX,1200...

大石桥市18741205986: 汇编语言的加,减,乘,除指令和计算机组成原理中所讲的加,减,乘,除运算是怎样的 -
符胃二乙: 要看它们,是不是同样的 CPU.如果是 8086/8088,加减乘除,分别就是 ADD、SUB、MUL 和 DIV.

大石桥市18741205986: 用汇编语言编写一个程序 -
符胃二乙: 1计算U =(X +(Y * Z-100))/ W 其中:X,Y,Z,W是16的符号数. 程序如下:数据段X DW 10; 16 可变功能?DW 20 于DW 30W DW 40> U DW?? 数据结束 代码段 假设CS:CODE,DS:DATA 开始: MOV AX,DATAMOV DS,AXMOV AX,YIMUL ...

大石桥市18741205986: 您好,偶然看到您回答了为频率为12mhz的mcs - 51编写10ms延时程序这道题, -
符胃二乙: #includeunsigned char i; void main() { TMOD=0x10; TH1=0x3c; TL1=0xb0; EA=1; ET1=1; TR1=1; while(1) { if(i==20) { i=0; //下面写你要处理的的其他程序,你只要了定时1s. } } } void a(void) interrupt 3 { unsigned char i; TH1=0x3c; TL1=0xb0; i++; }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网