目录
1.2汇编语言程序编程练习(P4)
例1.1 显示五行Hello
思维导图
实验程序图
正确代码
;FILENAME: EXA121.ASM
.486
DATA SEGMENT USE16
MESG DB 'HELLO'
DB 0,0,0 ;
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV ES,AX;
MOV CX,5
LL1: MOV MESG+5,0DH ;
MOV MESG+6,0AH ;
MOV MESG+7,'$' ;
CALL DISP
MOV MESG+5,0;
MOV MESG+6,0;
MOV MESG+7,0;
LOOP LL1
MOV AH,4CH
INT 21H
DISP PROC
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
RET
DISP ENDP
CODE ENDS
END BEG
代码注释
这段代码是汇编语言的代码,用于在DOS环境下显示"HELLO"五次。下面是对代码的注释:
;FILENAME: EXA121.ASM // 文件名
.486 // 指定使用Intel 80486或更高版本的指令集
DATA SEGMENT USE16 // 定义数据段
MESG DB 'HELLO' // 定义一个字符串变量MESG,值为'HELLO'
DB 0,0,0 ; // 在字符串后面添加三个空字节
DATA ENDS // 数据段结束
CODE SEGMENT USE16 // 定义代码段
ASSUME CS:CODE,DS:DATA // 指定代码段和数据段的关联
BEG: MOV AX,DATA // 将数据段的地址加载到AX寄存器
MOV DS,AX // 将AX寄存器的值赋给DS寄存器
MOV ES,AX; // 将AX寄存器的值赋给ES寄存器
MOV CX,5 // 将5赋值给CX寄存器
LL1: MOV MESG+5,0DH ; // 将回车字符(ASCII码为0DH)赋给MESG字符串的第6个字节
MOV MESG+6,0AH ; // 将换行字符(ASCII码为0AH)赋给MESG字符串的第7个字节
MOV MESG+7,'$' ; // 将'$'字符赋给MESG字符串的第8个字节
CALL DISP // 调用名为DISP的过程
MOV MESG+5,0; // 将MESG字符串的第6个字节清零
MOV MESG+6,0; // 将MESG字符串的第7个字节清零
MOV MESG+7,0; // 将MESG字符串的第8个字节清零
LOOP LL1 // 循环5次,LOOP指令会自动将CX寄存器的值减1,直到CX为0时退出循环
MOV AH,4CH // 将4CH赋值给AH寄存器,表示程序的退出代码为4CH
INT 21H // 调用21H中断,实现DOS系统功能
DISP PROC // 定义名为DISP的过程
MOV AH,9 // 将9赋值给AH寄存器,表示显示字符串的功能
MOV DX,OFFSET MESG // 将MESG字符串的偏移地址赋值给DX寄存器
INT 21H // 调用21H中断,实现DOS系统功能
RET // 返回到调用DISP过程的指令处
DISP ENDP // DISP过程结束
CODE ENDS // 代码段结束
END BEG // 程序结束
实验结果
1.3汇编语言语法实验(P8)
实验1.2:排除语法错误
实验程序图
正确代码
;FILENAME:EXA121.ASM
.486
DATA SEGMENT USE16
SUM DB ?,?
MESG DB '25+9=';
DB 0,0,'$';
N1 DB 9
N2 DB 25;
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS, AX
MOV BX, OFFSET SUM
MOV AH, N1
MOV AL, N2
ADD AH, AL
MOV [BX], AH
CALL CHANG
MOV AH, 9
MOV DX, OFFSET MESG
INT 21H
MOV AH, 4CH
INT 21H
CHANG PROC
LAST: CMP BYTE PTR[BX],10
JC NEXT
SUB BYTE PTR[BX],10
INC BYTE PTR[BX+7]
JMP LAST
NEXT: MOV AH,SUM
ADD [BX+8],AH
ADD BYTE PTR[BX+7],30H
ADD BYTE PTR[BX+8] ,30H
RET
CHANG ENDP
CODE ENDS
END BEG
代码注释
这段代码是汇编语言的代码,用于计算并显示25+9的结果。下面是对代码的注释:
;FILENAME: EXA121.ASM // 文件名
.486 // 指定使用Intel 80486或更高版本的指令集
DATA SEGMENT USE16 // 定义数据段
SUM DB ?,? // 定义SUM变量,占据两个字节的空间,用于存储计算结果
MESG DB '25+9=' // 定义一个字符串变量MESG,值为'25+9='
DB 0,0,'$' // 在字符串后面添加三个空字节
N1 DB 9 // 定义一个字节变量N1,值为9
N2 DB 25 // 定义一个字节变量N2,值为25
DATA ENDS // 数据段结束
CODE SEGMENT USE16 // 定义代码段
ASSUME CS:CODE, DS:DATA // 指定代码段和数据段的关联
BEG: MOV AX, DATA // 将数据段的地址加载到AX寄存器
MOV DS, AX // 将AX寄存器的值赋给DS寄存器
MOV BX, OFFSET SUM // 将SUM变量的偏移地址加载到BX寄存器
MOV AH, N1 // 将N1变量的值加载到AH寄存器
MOV AL, N2 // 将N2变量的值加载到AL寄存器
ADD AH, AL // 将AL和AH寄存器的值相加,并将结果存储在AH寄存器中
MOV [BX], AH // 将AH寄存器的值存储在SUM变量的地址中
CALL CHANG // 调用名为CHANG的过程
MOV AH, 9 // 将9赋值给AH寄存器,表示显示字符串的功能
MOV DX, OFFSET MESG // 将MESG字符串的偏移地址赋值给DX寄存器
INT 21H // 调用21H中断,实现DOS系统功能
MOV AH, 4CH // 将4CH赋值给AH寄存器,表示程序的退出代码为4CH
INT 21H // 调用21H中断,实现DOS系统功能
CHANG PROC // 定义名为CHANG的过程
LAST: CMP BYTE PTR[BX],10 // 比较SUM变量的值是否小于10
JC NEXT // 如果小于10,跳转到标签NEXT处
SUB BYTE PTR[BX],10 // 如果大于等于10,将SUM变量的值减去10
INC BYTE PTR[BX+7] // 将SUM变量的第8个字节加1
JMP LAST // 跳转到标签LAST处
NEXT: MOV AH,SUM // 将SUM的值加载到AH寄存器
ADD [BX+8],AH // 将AH寄存器的值加到SUM变量的第9个字节
ADD BYTE PTR[BX+7],30H // 将SUM变量的第8个字节加上ASCII码的'0'
ADD BYTE PTR[BX+8] ,30H // 将SUM变量的第9个字节加上ASCII码的'0'
RET // 返回到调用CHANG过程的指令处
CHANG ENDP // CHANG过程结束
CODE ENDS // 代码段结束
END BEG // 程序结束