南京邮电大学汇编——实验一:汇编语言语法练习与代码转换
实验环境
- DosBox
- Tasm
实验一:在屏幕下打印学号
实验代码
说实话,第一个实验就是用来熟悉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使用记录
DosBox的安装是傻瓜式的安装,无论是在IA-32架构下还是在AMD64的架构下。所以这里就不贴了。
第一步是在DosBox环境下将本地文件夹挂载到DOS下面。使用如下命令挂载
mount c YouFilePath
需要注意的有两个点:
- 这里的本地文件夹路径最好是不要带有中文,因为在Dos环境下是只支持英文字符集的;
- 如果本地文件/文件夹的路径过长的话会出现波浪号,原因在于DOS环境下的文件名最多只有8个字符,超过8个字符会缩写。
挂载完使用如下指令进行汇编
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
编译运行,通过。