1.1输出5个helloword
;FLENAME: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
1.2排除语法错误。
下面给出的是一个意想通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。 要求实验者按照原样对源程序进行编辑,汇编后,根据TASM给出的错误信息对源程序进行修改,直到没有语法错误为止。然后进行链接,并执行相应的可执行文件。正确的执行结果是在屏幕上显示:25+9=34。
程序清单
;FILENAME:EXA131.ASM
.486
DATA SEGMENT USE16
SUM DB ?,?,
MESG DB ‘25+9=’
DB 0,0
N1 DB 9,F0H
N2 DW 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,OFFSEG MEST
INT 21H
MOV AH,4CH
INT 21H
CHANG: PROC
LAST: CMP [BX],10
JC NEXT
SUB [BX],10
INC [BX+7]
JMP LAST
NEXT: ADD [BX+8],SUM
ADD [BX+7],30H
ADD [BX+8],30H
RET
CHANG: ENDP
CODE ENDS
END BEG
修改后的程序
;FILENAME EXA131.ASM
.486
DATA SEGMENT USE16;SEGMENT关键词有缩写
;用于保存结果的二进制数
SUM DB ?,?;多了一个逗号
;用于保存结果的二进制数
;显示的字符串
MESG DB '25+9='
DB 0,0,'$';添加结束符
;显示的字符串
N1 DB 9,0F0H;十六进制开头需要以0开始,但是第二个没有用到,这里保留
N2 DB 25;根据N1和16行可知该数据类型为DB
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SUM
;计算N1+N2,并将结果保存到SUM处
MOV AH,N1
MOV AL,N2
ADD AH,AL
MOV [BX],AH
;计算N1+N2,并将结果保存到SUM处
;CHANG功能为转发字符串
CALL CHANG
;CHANG功能为转发字符串
;调用DOS显示功能
MOV AH,9
MOV DX,OFFSET MESG;是MESG不是MEST
INT 21H
;调用DOS显示功能
;调用DOS退出功能
MOV AH,4CH
INT 21H
;调用DOS退出功能
CHANG:
LAST:
;算法:由于只有两位数,每次减10,并且显示位(十位)加1直到SUM小于10
CMP byte ptr [BX],10;指定内存单元大小
JC NEXT
SUB byte ptr [BX],10;指定内存单元大小
INC byte ptr [BX+7];指定内存单元大小
JMP LAST
;算法:由于只有两位数,每次减10,并且显示位(十位)加1直到SUM小于10
NEXT:
;将个位数移到显示位(个位)上
;ADD指令不能两个操作数均为内存地址,且AH没有被使用,使用AH来中转
MOV AH,[BX]
MOV [BX+8],AH
;ADD指令不能两个操作数均为内存地址,且AH没有被使用,使用AH来中转
;将个位数移到显示位(个位)上
;0x30为字符'0'的ASCII码表
ADD byte ptr [BX+7],30H
ADD byte ptr [BX+8],30H
;0x30为字符'0'的ASCII码表
RET
CODE ENDS
END BEG