说实话,第一个实验就是用来熟悉IDE环境的= =先贴一下实验代码吧。
.586
DATA SEGMENT USE16 ;定义数据段
MESG DB 'Hello, world!', '$'
DATA ENDS
CODE SEGMENT USE16 ;定义代码段
ASSUME CS: CODE, DS: DATA ;说明段约定
BEG: MOV AX, DATA ;BEG为启动地址
MOV DS, AX
MOV AH, 9
MOV DX, OFFSET MESG
INT 21H
MOV AH, 4CH
INT 21H ;返回DOS
CODE ENDS
END BEG ;汇编结束
把自己的学号修改一下就是实验的代码了。
DosBox的安装是傻瓜式的安装,无论是在IA-32架构下还是在AMD64的架构下。所以这里就不贴了。
第一步是在DosBox环境下将本地文件夹挂载到DOS下面。使用如下命令挂载
mount c YouFilePath
需要注意的有两个点:
TASM SAYHI.ASM
需要注意的是TASM和SAYHI.ASM需要使用相对路径。
编译完成之后进行连接
TLINK SAYHI.OBJ
先贴一下错误的实验代码吧。
;FILENAME EXA131.ASM
.486
DATA SEGME NT 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,OFFSET 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 [BX+8],30H
;0x30为字符'0'的ASCII码表
RET
CODE ENDS
END BEG