南京邮电大学汇编——实验一:汇编语言语法练习与代码转换

南京邮电大学汇编——实验一:汇编语言语法练习与代码转换

  • 实验环境
  • 实验一:在屏幕下打印学号
    • 实验代码
    • DOSBOX使用记录
  • 实验二:改错汇编源代码

实验环境

  • 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

需要注意的有两个点:

  1. 这里的本地文件夹路径最好是不要带有中文,因为在Dos环境下是只支持英文字符集的;
  2. 如果本地文件/文件夹的路径过长的话会出现波浪号,原因在于DOS环境下的文件名最多只有8个字符,超过8个字符会缩写。

南京邮电大学汇编——实验一:汇编语言语法练习与代码转换_第1张图片挂载完使用如下指令进行汇编

TASM SAYHI.ASM

需要注意的是TASM和SAYHI.ASM需要使用相对路径。
编译完成之后进行连接

TLINK	SAYHI.OBJ

注意点同上。
连接完成之后运行。
南京邮电大学汇编——实验一:汇编语言语法练习与代码转换_第2张图片

实验二:改错汇编源代码

先贴一下错误的实验代码吧。

;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

直接进行汇编的话会出现如下错误。

南京邮电大学汇编——实验一:汇编语言语法练习与代码转换_第3张图片照着行数改就是了。我贴一份我修改好的代码并进行了代码解析

;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

编译运行,通过。
南京邮电大学汇编——实验一:汇编语言语法练习与代码转换_第4张图片

你可能感兴趣的:(学校实验)