精华内容
下载资源
问答
  • 汇编语言上机实验

    2017-03-27 17:05:18
    汇编语言上机实验
  • 合肥工业大学汇编语言上机实验报告(全,完成版)2019版,含完整实现代码。 合肥工业大学汇编语言上机实验报告(全,完成版)2019版,含完整实现代码。 合肥工业大学汇编语言上机实验报告(全,完成版)2019版,含...
  • 汇编语言上机1

    2018-04-13 22:36:24
    汇编语言上机2.3 编写一程序使其实现将1个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把两个数组显示出来。 代码 DATAS SEGMENT ;此处输入数据段代码 MARRAY DW 1,2,3,4,5,-6,-7,-8,-...

    汇编语言上机2.3

    编写一程序使其实现将1个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把两个数组显示出来。

    代码

    DATAS SEGMENT   ;此处输入数据段代码 
    MARRAY  DW  1,2,3,4,5,-6,-7,-8,-9,-1,-1,2,3,4,-5,-6,-7,8,9,2,'$'
    PARRAY  DW 20 DUP(?)
    NARRAY  DW 20 DUP(?)   
    str1 DB 'Positive numbers:$'
    str2 DB 'Negative numbers:$'
    DATAS ENDS
    
    STACKS SEGMENT ;此处输入堆栈段代码
     DW 100 DUP(?)
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX ;此处输入代码段代码
        MOV DI,0  ;统计正数个数
        MOV SI,0  ;统计负数个数
        MOV BP,0  
    AGAIN:
             CMP  BP,40
             JZ   DISP
             LEA BX,MARRAY[BP]
             ADD BP,2
             MOV DX,[BX]
    
    BIJIAO:  CMP DX,0
             JG  PARRAY1  ;大于跳转
             JL  NARRAY1  ;小于跳转
    PARRAY1:
            MOV AX,[BX]
            MOV PARRAY[DI],AX
            ADD DI,2
    
    
           JMP AGAIN  
    NARRAY1:
            MOV AX,[BX]
            MOV NARRAY[SI],AX
            ADD SI,2
            JMP AGAIN
    
    DISP:
          MOV BP,0
          MOV AH, 9     ;提示1   
          LEA DX, str1
          INT 21H          
    POSA1:
    
          LEA BX,PARRAY[BP]
          MOV AX,[BX]
          ADD BP,2
          ADD AX,30H
          MOV DL,AL
          MOV AH ,06H;输出正数
          INT 21H
    
          mov ah,2;输出空格
          mov dl,32
          int 21h
    
          CMP BP,DI
          JNE  POSA1
    
         MOV AH,2     ;换行   
          MOV DX, 0AH
          INT 21H 
    
    
    
          MOV AH,9  ;提示2      
          LEA DX, str2
          INT 21H 
        MOV BP,0
    NEG1:
        MOV AH,2;输出负号
        MOV DL,2DH
        INT 21H
    
        LEA BX,NARRAY[BP]
          MOV AX,[BX]
          ADD BP,2
          NEG AX
          ADD AX,30H
          MOV DX,AX
          MOV AH ,06H;输出数字
          INT 21H
    
          mov ah,2;输出空格
          mov dl,32
          int 21h
         CMP BP,SI
          JNE  NEG1
    
    
         MOV AH,4CH
         INT 21H
    CODES ENDS
        END START
    
    展开全文
  • 全国等级考试 三级PC技术 汇编语言上机 考试软件环境.zip
  • 汇编语言上机的4个步骤 1.点击命令提示符图标 进入DOS C:\Documents and Settings\Administrator>CD… (两个点)按Enter键 C:\Documents and Settings> CD…(两个点) 按Enter键 C:\ cd MASM按Enter键 C:\ ...

    汇编语言上机的4个步骤

    1.点击命令提示符图标 进入DOS
    C:\Documents and Settings\Administrator>CD… (两个点)按Enter键
    C:\Documents and Settings> CD…(两个点) 按Enter键
    C:\ cd MASM按Enter键
    C:\ MASM> EDIT XXX.ASM”并按Enter键,
    进入全屏幕编辑状态,输入程序,然后将编辑好的源程序保存(File下拉菜单选SAVE),或用后缀为.ASM的文件名存入U盘。重新启动计算机时文件丢失。
    注意:源文件扩展名必须为.ASM。
    2.利用汇编程序MASM将XXX .ASM文件转换成 XXX.OBJ文件
    汇编程序MASM的作用:将源文件转换成二进制代码表示的目标文件(称为.OBJ文件),汇编结束后,汇编程序将指出源程序中的语法错误。
    汇编命令格式如下。
    C:\MASM>MASM XXX;(分号)
    0 Warning Errors
    0 severe Errors后执行下一步
    3.利用连接程序LINK把XXX.OBJ程序转换成可执行程序XXX.EXE程序
    .
    连接命令为如下
    C:\MASM>LINK XXX;(分号)
    4.程序的运行
    常用调试方法(1)利用DEBUG调试程序(参考附录有关DEBUG的命令)。
    C:\MASM>DEBUG XXX .EXE
    带显示功能的程序(2)直接输入文件名就可以执行该程序。
    C:\MASM>XXX .EXE
    注意:要根据程序的特点选择程序的运行方式。

    出现提示符“-”,表示已进入DEBUG状态,可以使用DEBUG命令。
    ①用U命令查看程序是否进入内存。
    -U回车
    代码段 偏移量 机器码 源程序
    18F4: 2000 1E PUSH DS
    18F4: 2001 2BC0 SUB AX,AX
    18F4: 2003 50 PUSH AX
    18F4: 2004 B8F618 MOV AX,18F6H
    18F4: 2007 8ED8 MOV DS,AX
    ……
    ……
    18F4: xxxx xxxx RET
    上面从左到右依次给出了程序所在的段地址、偏移地址、机器语言指令和汇编语言指令。系统自动给程序分配了数据段(址为18F6H,说明程序的数据都在这个18F6H段的相关内存单元内存单元。
    ②利用T命令执行程序,
    T为单步执行命令,既每一个T执行一条指令,观察寄存器存储单元的值及各标志的变化。
    ③检查程序的运行结果。
    利用D命令检查该内存单元是否为这个结果。
    -D数据段段基址 : 偏移地址(要查看的存储单元的偏移地址)
    本例中D 18F6:1000
    ④运行命令G(GO)
    运行命令G的格式如下。
    —G
    其中,ADDRESS1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示所有寄存器和标志位的内容,以及下一条将要执行的指令。

    (5)退出DEBUG命令Q(QUIT)
    退出DEBUG命令Q的格式如下
    -Q
    该命令将退出DEBUG,并返回DOS。
    最终显示“C:> MASM>”。
    除上述命令外,DEBUG的常用命令R可以显示和修改寄存器的内容,命令E可以显示和修改内存单元的内容,命令G可以连续执行指令。

    2、使用DOSBOX软件搭建汇编环境,调用masm和link程序,将源代码编译链接成可执行程序(maxmin.exe)。如图
    在这里插入图片描述
    在这里插入图片描述

    3、运行maxmin.exe,查看程序运行情况及结果检验
    在DOS环境中运行debug maxmin.exe,运用debug的u,g,d,r,t调用功能,即可查看检验程序运行状况。
    首先调用反汇编指令u查看每条代码的代码段偏移地址
    在这里插入图片描述

    找到已初始化完成语句MOV AX,SEG AREA,该语句对应的偏移地址为0005,
    再调用运行命令g,执行g5 ,并调用显示内存单元内容的命令D (d0)查看内存单元内容
    在这里插入图片描述

    绿框中为待处理10个无符号数100,3,654,54,898,3,125,6666,545,781对应的16进制存储单元,每4位16进制对应一个0~65535无符号数,共20个存储单元。两红框中为表示最大值和最小值的变量MAX和MIN的存储单元,预设值分别为65535和0,即16进制数FFFF和0000。
    再次调用反汇编指令u查看后续代码的代码段偏移地址,找到主程序已运行完毕的语句MOV AH,4CH,该语句对应的偏移地址为0046
    在这里插入图片描述

    再调用运行命令g,执行g0046,并调用显示内存单元内容的命令D (d46)查看内存单元内容
    在这里插入图片描述

    变量MAX中为十六进制数1A0A,刚好对应十个数中最大数6666,
    变量MIN中为十六进制数0003,刚好对应十个数中最小数3,运行结果正确。
    实验过程原始记录及计算结果(数据、表格、计算、曲线等)
    在完成求取最小值程序编写后,我尚未继续编写求取最大值程序,以便于检验最小值程序和整体框架的正确性,经运行调试后,得到正确的求取最小值程序,但之后我本打算将最小值程序稍作修改得到最大值程序,编写后进行调试发现如下错误结果
    在这里插入图片描述

    经检查发现,是我在求取最小值程序后尚未将变址寄存器SI赋值回数组AREA的首地址,使得求取最大值程序发生错误。改正方法:求取最大值程序前应重新初始化,将SI赋回数组AREA的首地址,修改程序,加上 MOV SI,OFFSET AREA命令,之后运行调试正确。

    附录2 常用DOS功能调用一览表
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    功能号在AH中,并设好其他入口参数,向DOS发出INT 21H命令,最后获得出口参数,如表7所示。
    表7
    调 用 号 功 能 入口参数 出口参数
    00H 程序终止 CS=PSP段地址 —
    01H 键盘输入字符 — AL=输入的字符
    02H 显示输出 DL=显示的字符 —
    03H 串行设备输入 — AL=输入的字符
    04H 串行设备输出 DL=输出的字符 —
    05H 打印输出 DL=输出的字符 —
    06H 直接控制台I/O DL=0FFH(输入请求);
    DL=字符(输出请求) AL=输入的字符

    07H 直接控制台I/O
    (不显示输入) — AL=输入的字符

    08H 键盘输入字符(无回显) — AL=输入的字符
    09H 显示字符串 DS:DX=缓冲区首址 —
    0AH 输入字符串 DS:DX=缓冲区首址 —
    0BH 检查标准输入状态

    AL=00无按键;
    AL=0FFH有按键
    0CH 清除输入缓冲区并执行指定的标准输入功能 AL=功能号(01/06/07/08/0AH);
    DS:DX=缓冲区(0AH功能) AL=输入的数据(功能01/06/07/08)
    0DH 初始化磁盘状态 — —
    0EH 选择默认的驱动器 DL=驱动器号(0=A,1=B…) AL=逻辑驱动器数
    0FH 打开文件 DS:DX=未打开的FCB首址 AL=00成功;
    AL=0FFH失败
    10H 关闭文件 DS:DX=打开的FCB首址 AL=00成功;
    AL=0FFH失败
    11H 查找第一匹配目录 DS:DX=未打开的FCB首址 AL=00成功;
    AL=0FFH失败
    12H 查找下一匹配目录 DS:DX=未打开的FCB首址 AL=00成功;
    AL=0FFH失败
    13H 删除文件 DS:DX=未打开的FCB首址 AL=00成功;
    AL=0FFH失败
    14H 顺序读 DS:DX=打开的FCB首址 AL=00成功;
    AL=01文件结束;
    AL=02缓冲区太小;
    AL=03缓冲区不满
    15H 顺序写 DS:DX=打开的FCB首址 AL=00成功;
    AL=01盘满;
    AL=02缓冲区太小
    16H 创建文件 DS:DX=未打开的FCB首址 AL=00成功,AL=0FFH目录区满
    17H 文件换名 DS:DX=被修改的FCB首址 AL=00成功,AL=0FFH未找到目录项或文件重名
    *18H 保留未用 — —
    19H 获取默认驱动器号 — AL=驱动器号(0=A,1=B…)
    1AH 设置磁盘缓冲区DTA DS:DX=磁盘缓冲区首址 —
    *1BH 获取默认驱动器的磁盘格式信息 — AL=每簇的扇区数;
    CX=每扇区的字节数;
    DX=数据区总簇数-1;
    DS:BX=介质描述字节
    *1CH 获取指定驱动器的磁盘格式信息 DL=驱动器号(0=默认,1=A…) AL=每簇的扇区数;
    CX=每扇区的字节数;
    DX=数据区总簇数-1;
    DS:BX=介质描述字节
    *1DH 保留未用 — —
    *1EH 保留未用 — —
    *1FH 获取默认驱动器的DPB — DS:BX=DPB首址
    *20H 保留未用 — —
    21H 随机读一个记录 DS:DX=打开的FCB首址 AL=00成功;
    AL=01文件结束;
    AL=02缓冲区太小;
    AL=03缓冲区不满
    22H 随机写一个记录 DS:DX=打开的FCB首址 AL=00成功;
    AL=01盘满;
    AL=02缓冲区太小
    23H 获取文件大小 DS:DX=未打开的FCB首址 AL=00成功;
    AL=0FFH失败
    24H 设置随机记录号 DS:DX=打开的FCB首址 —
    25H 设置中断向量 AL=中断号
    DS:DX=中断程序入口 —
    *26H 创建新的PSP DS:DX=新的PSP段地址 —
    27H 随机读若干记录 DS:DX=打开的FCB首址
    CX=要读入的记录数 AL=00成功, AL=01文件结束,AL=02缓冲区太小,AL=03缓冲区不满;
    CX=读入的块数
    28H 随机写若干记录 DS:DX=打开的FCB首址
    CX=要写入的记录数 AL=00成功, AL=01盘满,AL=02缓冲区太小,AL=03缓冲区不满;
    CX=已写的块数
    29H 分析文件名 AL=分析控制标记
    DS:SI=要分析的字符串
    ES:DI=未打开的FCB首址 AL=00未通配符,AL=01有通配符,AL=0FFH驱动器字母无效;
    ES:DI=未打开的FCB
    2AH 获取系统日期
    — CX=年(1980~2099),DH=月,DL=日,AL=星期(0=星期日)
    2BH 设置系统日期 CX=年,DH=月,DL=日 AL=00成功, AL=0FFH失败
    2CH 获取系统时间 — CH=时(0~23),CL=分,DH=秒,DL=百分之几秒
    2DH 设置系统时间 CX=时,分DX=秒,百分秒 AL=00成功,AL=0FFH失败
    2EH 设置/复位校验开关 AL=0关闭,1打开 —
    2FH 获取磁盘传输地址DTA — ES:BX=DTA首地址
    30H 获取DOS版本 — AL,AH=DOS的主、次版本
    31H 结束并驻留 AL=返回码,DX=内存大小 —
    *32H 获取指定驱动器的DPB — DS:BX=DPB首址
    33H 获取或设置Ctrl+Break标志 AL=0:取,1:置,DL=标志 DL=标志(取功能)
    0:关
    1:开
    *34H 获取DOS中断标志 — ES:BX=DOS中断标志
    35H 获取中断向量地址 AL=中断号 ES:BX=中断程序入口
    36H 获取磁盘的自由空间 DL=驱动器号(0=缺省,1=A AX=FF驱动器无效,其他每簇扇区数
    BX=自由簇数;
    CX=每扇区字节数;
    BX=文件区所占簇数
    *37H 获取/设置参数分隔符;
    获取/设置设备名许可标记 AL=0:取分隔符,
    1:置分隔符,DL=分隔符
    2:取许可标记
    3:置许可标记,DL=许可标记 DL=分隔符(功能0);
    DL=许可标记(功能2)
    38H 获取国家信息 AL=0,DS:DX=缓冲区首址 —
    39H 创建子目录 DS:DX=路径字符串 CF=0成功, CF=1失败;AX=错误码
    3AH 删除子目录 DS:DX=路径字符串 CF=0成功, CF=1失败;AX=错误码
    3BH 设置子目录 DS:DX=路径字符串 CF=0成功, CF=1失败;AX=错误码
    3CH 创建文件 DS:DX=带路径的文件名
    CX=属性1(只读),CX=属性2(隐蔽),CX=属性4(系统) CF=0成功,AX=文件号;
    CF=1失败,AX=错误码
    3DH 打开文件 DS:DX=带路径的文件名;
    AL=方式0(读);
    AL=方式1(写);
    AL=方式2(读写) CF=0成功,AX=文件号;
    CF=1失败,AX=错误码
    3EH 关闭文件 BX=文件号 CF=0成功;
    CF=1失败,AX=错误码
    3FH 读文件或设备 BX=文件号;
    CX=字节数 CF=0成功;
    DX:AX=新的指针位置
    40H 写文件或设备 DS:DX=缓冲区首址 CF=1失败,AX=错误码
    41H 删除文件 DS:DX=带路径的文件名 CF=0成功, CF=1失败,
    AX=错误码
    42H 移动文件指针 AL=方式0(正向);
    AL=方式1(相对);
    AL=方式2(反向);
    BX=文件号;
    CX:DX=移动的位移量 CF=0成功,DX:AX=新的文件指针;
    CF=1失败,AX=错误码
    43H 获取/设置文件属性 AL=0(获取);
    AL=1(设置);
    CX=新属性;
    DS:DX=带路径的文件名 CX=属性(功能0)
    1-只读
    2-隐蔽4-系统20H-归档
    44H 设备输入/输出控制:获取/设置与打开设备的句柄相关联的信息,或
    发送/接收控制字符串至设备句柄 AL=0/1(获取/设置设备信息);
    AL=2/3(读/写设备控制通道);
    AL=4/5(同功能2/3);
    AL=6/7(取输入/输出状态);
    BX=句柄(功能03,67);
    BL=驱动器号(功能4~5);
    CX=字节数(功能2~5);
    DS:DX=缓冲区(功能2~5) CF=0成功;
    DX=设备信息(功能0);
    AL=状态(功能6/7),0表示未准备,1表示准备;
    AX=传送的字节数(功能2-5)
    45H 复制文件号(对于打开的文件返回一个文件号) BX=文件号 CF=0成功,AX=新文件号;
    CF=1失败,AX=错误码
    46H 强行复制文件号 BX=现存的文件号;
    CX=第2文件号 CF=0成功,CF=1失败;
    AX=错误码
    47H 获取当前目录 DL=驱动器号;
    DS:SI=缓冲区首址 CF=0成功, CF=1失败;
    AX=错误码
    48H 分配内存 BX=所需的内存节数 CF=0成功,AX=分配的段数;
    CF=1失败,AX=错误码;
    BX=最大可用块大小
    49H 释放内存 ES=释放块的段值 CF=1失败,AX=错误码
    4AH 修改分配内存 ES=修改块的段值;
    BX=新长度(以节为单位) CF=1失败;AX=错误码;
    BX=最大可用块大小
    4BH 装载程序;运行程序 AL=0装载并运行;
    AL=1获得执行信息;
    AL=3装载但不运行;
    DS:DX=带路径的文件名;
    ES:BX=装载用的参数块 CF=1失败;AX=错误码

    4CH 带返回码的结束 AL=进程返回码 —
    4DH 获取由31H/4CH返回的返回码
    — AL=进程返回码;
    AH= 0表示正常结束,AH= 1表示由Ctrl+Break结束,AH= 2表示由严重设备错误而结束,AH= 3表示由调用31H而结束
    4EH 查找第一个匹配项 DS:DX=带路径的文件名;
    CX=属性 CF=1失败;AX=错误码
    4FH 查找下一个匹配项 CF=1失败,AX=错误码
    *50H 建立当前的PSP段地址 BX=PSP段地址 —
    *51H 读当前的PSP段地址 — BX=PSP段地址
    *52H 获取DOS系统数据区首址 — ES:BX=DOS数据区首址
    *53H 为块设备建立DPB DS:SI=BPB,ES:DI=DPB —
    54H 获取校验开关设定值 — AL=标志值(0:关,1:开)
    *55H 由当前PSP建立新PSP DX=PSP段地址 —
    56H 文件换名 DS:DX=带路径的旧文件名
    ES:DI=带路径的新文件名 CF=1失败,AX=错误码
    57H 获取/置文件时间及日期
    AL=0/1取/置,BX=文件号
    CX=时间,DX=日期 CF=0成功,CX=时间,DX=
    日期

    展开全文
  • 关于汇编的上机压缩文件。汇编语言语句格式中对名字项的规定如下: (1)名字的第一个字符可以是大写英文字母及小写英文字母; (2)名字的有效长度≤31个字符; (3)在名字中不允许出现$.
  • 一、 实验题目1. 编制一汇编源程序,求出下列公式中的Z...两种方式编制完整的汇编语言 程序设计说明(用来说明程序的功能、结构。包括:程序名、功能、原理及算法说明、程序及数据结构、主要符号名的说明、程序框图等。)
  • 1汇编语言上机指导及例示 从如何建立源文件到进行调试作下简要的介绍,并配例题说明。由于本人水平有限,在下文在如有错误及可以进一步修改的地方请大家指出 汇编语言上机过程: 一、上机前的软件准备: MS-DOS...
    1 汇编语言上机指导及例示
     
    从如何建立源文件到进行调试作下简要的介绍,并配例题说明。由于本人水平有限,在下文在如有错误及可以进一步修改的地方请大家指出 

    汇编语言上机过程: 
    一、上机前的软件准备:
    MS-DOS操作系统(如:MSDOS6.22 , MSDOS7.0 等)
    文本编辑器 (如:EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等)
    汇编程序 (如:MASM.EXE , ASM.EXE 等)
    连接程序 (如:LINK.EXE 等)
    调试程序 (如:DEBUG.EXE 等)

    二、汇编程序建立过程:

     


    a.建立汇编源程序—通过———→b.编译为目标文件— ↓┬—→d.连接为可执行文件
      ↑                        
      │  c.不通过,重新修改(语句错误)               ↓ 
      ├——————————————————————┘        ↓
      ↑   f.不正确,用调试工具调试,重新修改(逻辑错误)     ↓ 
      └————————————————————————————←e运行
                                     ↓正确
                                  g.完成


    三、现在对(二)的每一个标有字母的过程(PROCEDURE)进行详细说明

    PROCEDURE a:建立汇编源程序(即:建立 文件名.asm)
    这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变为了计算机,这个过程也称源代码录入。将源程序代码录入计算机的方法很多,下面将介绍具体方法。 
    1.通过MD-DOS自带的EDIT.EXE文本编辑器进行输入,在DOS提示符下键入:EDIT回车,这时如果你系统内可调用时,EDIT的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:filename.asm ;(其中filename为你起的文件名,由1-8个字符组成),asm 是为汇编程序识别而必须加上去的,不可更改。存盘后在DOS下可用DOS命令DIR来查看,如果看到了所存的文件存在,就可以进行进程b。
    2.如果你的系统中没有EDIT,也可用你所熟悉的文本编辑器进行录入、编辑,如可用c语言和pascal语言的文本编辑器来编辑,最后将文件存为filename.asm的形式即可。

    PROCEDURE b:编译目标文件(即:编译为.obj .lst .crf文件)
    这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及交叉引用表的目标文件。如果此时你的程序有语句错误,系统将报错,并指出在第几行,什么类型的错误,你可根据提示去逐一修改。现介绍具体过程:
    在DOS提示符下键入MASM filename回车
    (注:你系统内的汇编程序为MASM.EXE,如果你系统的汇编程序为ASM.EXE时,便将命令变为ASM filename回车。其中filename为你刚才在PROCEDURE a 中建立的文件名)
    这时汇编程序的输出文件可以有三个(分别:.obj .lst .crf),便会出现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错误个数,如果为0则表示顺利通过,就可进行进程c。但如果不为0就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。 MASM filename >filen (filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看filen来得到出错信息。

    PROCEDURE c:编译不通过,重新修改(错误类型:源程序语句不合法)
    在执行过PROCEDURE b后,如有出错信息时,就要我们自己按PROCEDURE c去做,而不能跳跃到PROCEDURE d去,如果强行执行PROCEDURE d将无任何有效结果。
    现在就开现找错吧!首先要清楚,在PROCEDURE b中检测出的错误均为每一条语句的语法或用法错误,它并不能检测出程序的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。在记录行号后,就应再次执行PROCEDURE a,这时和操作应是打开已编好的源程序(以EDIT为例:在DOS提示符下键入:
       
     
       

    2 汇编语言上机指导及例示
     
    EDIT filename.asm回车),依据行号进行修改并存盘,再次进行汇编,直至PROCEDURE b通过为止。便可继续向下执行PROCEDURE d。
    下面给出一些常见出错信息,以便查对:

    1、Register already defined 汇编内部出现逻辑错误
    2、Unknown symbol type 在符号语句的类型中,有些不能识别的东西
    3、Symbol is multi-defined 重复定义一个符号
    4、Symbol not defined 符号没有定义
    5、Syntax error 语句的语法与任何可识别的语法不匹配
    6、Symbol is reserved word
    企图非法使用一个汇编程序的保留字(例:定义add为一变量)
    7、Not proper align/combine type SEGMENT参数不正确
    8、One operand must be const 这是加法指令的非法使用
    9、Operands must be same or 1 abs 这是减法指令的非法使用
    10、Already have base register 试图重复基地址
    11、Illegal size for item 引用的项的长度是非法的,(如:双字移位)
    12、Illegal register value 指定的寄存器值不能放入“reg” 字段
    13、Must be AX or AL 某些指令只能用AX或AL
    14、Improper use of segment reg 段寄存器使用不合法(如:mov ds,0)
    15、Division by 0 or overflow 给出一个用0作除数的表达式
    16、value is out of range 数值大于需要使用的
    17、CS register illeal usage 试图非法使用CS寄存器
    18、DUP is too large for linker
    DUP嵌套太长,以至于从连接程序不能得到所要的记录

    PROCEDURE d:连接为可执行文件(即:连接为.exe 或.com文件)
    在这个过程中一般没有意外,如果有也就是文件名打错了。
    形式:在DOS提示符下: LINK filename 回车

    PROCEDURE e:运行编译好的可执行文件
    当PROCEDURE d通过后,会产生一个可执行文件,这时只需运行这个程序,看它是否按你所想象那样得出结果。在试运行期间,要尽量试一些临界状态,看 程序是否运行稳定、结果是否正确。如一切正常,便可进入PROCEDURE g了。
    可最怕的是不OK,程序产生一些莫名其妙的结果(你可不要以为是你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执行。我以前总以为我的计算机出了毛病),如果是在考场上这时千万不要慌,稳住自己的情绪,先不要看计算机,静几分钟(反正时间多得是)。这时就要用到最关键、最常用的一步了,进行PROCEDURE f 。

    PROCEDURE f:用调试工具调试,重新修改(逻辑错误)
    在这我将介绍用DOS中自带的调试程序DEBUG.EXE来进行程序调试、检查错误.
    首先我们要了解DEBUG的基本用法: 
    1、用于调试程序时的输入格式:
    DEBUG FILENAME.??? 回车
    其中FILENAME是主文件名,???是扩展文件名,例如我们在此前已编译好了一个文件,它的名子为:djx.exe 要对它进行调试时就在DOS提示符下
    打:DEBUG djx.exe 回车,便可见到 '-' 提示符,如无任何提示说明正确,可进行调试。
    2、DEBUG调试过程中用到的DEBUG命令介绍:
    (注:在指令中用 [] 括起来的内容可缺省)
    1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即DS段):
    格式:d[地址] 从[地址]指定的内存单元显示128个字节的内容
    [地址]缺省时,显示上一个DUMP命令后面的内容 
    d 地址范围 显示指定范围内的内存内容。
    示例:-d100 显示从DS段100H开始的内容(以十六进制显示)

    2)E(Enter)修改存储单元内容(一般在DS段)
    格式:e 地址 [数据] 用给定的[数据]代替指定范围的存储单元内容
    e 地址 修改一个指定内存单元的内容
    示例:-e ds:200 'djx'FF00AA 就可将DS段从200开始至205的内容替
    换为64 6A 78 FF 00 AA

    3)G(GO)运行命令
    格式:-g [=地址][断点地址1 [断点地址2 ...[断点地址10]]]
    从指定[地址]开始执行程序(如地址缺省从当前CS:IP开始),运行至[断点地址1]停止,显示所有寄存器及标志位内容与下一条指令,如后面还有断点,可键入g,继续执行。
       
     
       

    3 汇编语言上机指导及例示
     
    示例:-g001a 则执行从当前cs:ip至001a的指令
    注意:地址设置必须从指令的第一字节设起。

    4)T(Trace)执行一条语句
    格式: -t [=地址] 从指定[地址]起执行一条语句后停下来,显示所有寄存器内容及标志位的值与下一条指令。如[地址]缺省则从当前CS:IP开始执行
    -t [=地址][value] 从指定地址起执行value条指令后停止。

    5)P(proceed)执行一个循环;一个软中断或call子过程
    格式:-p [=地址][n]
    示例: mov ah,02h
    mov dl,41h
    int 21h
    此时用: -p 回车后系统将显示一个字符A,如果在这不用P,而改用T,那么系统将进入INT 21H的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意!!

    6)R(register)显示并可修改寄存器内容
    格式:-r 显示所有寄存器内容
    -r 寄存器名 修改指定寄存器内容(可改:AX,BX,CX,DX,SP,
    BP,SI,DI,CS,DS,ES,SS,PC,IP,F)

    7)U(Unassemble)反汇编
    格式:-u [地址] 从指定[地址]反汇编32个字节,若[地址]缺省则从当前地址汇编32个字节。
    -u 地址范围 对指定范围内的存储单元进行反汇编

    以上是在调试程序中可能用到的DEBUG命令解释,DEBUG中还有其它命令,在检查程序中不会用到,就不再介绍了。

    PROCEDURE g:程序编好,那就一切OK!!!交卷过关了!大吃、大睡。

    下面给出一个有病句的程序,希望大家和我一起调试、修改并通过:
    先执行PROCEDURE a编辑源程序
    实现功能:在屏幕上显示:Hello world
    My name is DJX
    文件名:error.asm
    行号: 源程序代码:

    1 data segment
    2 out1 db 'Hello world'
    3 ax db 'My name is DJX'
    4 data ens
    5
    6 code segment
    7 assume cs:code;ds:data
    8 lea dx,out1
    9 mov ah,2
    10 int 21h
    11
    12 mov dl,0ah
    13 mov ah,2
    14 int 21h
    15 mov dl,0dh
    16 moo ah,2
    17 int 21h
    18
    19 lea dx,ax
    20 mov ah,
    21 int 21h
    22 code ends

    在编辑完执行PROCEDURE b用masm进行编译:masm error回车后显示如下:
    Microsoft (R) Macro Assembler Version 5.00
    Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

    Object filename [error.OBJ]:
    Source listing [NUL.LST]:
    Cross-reference [NUL.CRF]:
    End of file encountered on input file
    error.ASM(23): warning A4085: End of file, no END directive
    Open segments: DATA
    error.ASM(3): warning A4016: Reserved word used as symbol: AX
    error.ASM(4): error A2105: Expected: instruction or directive
    error.ASM(16): error A2105: Expected: instruction or directive
    error.ASM(19): error A2049: Illegal use of register
    End of file encountered on input file
    error.ASM(23): warning A4085: End of file, no END directive

    51566 + 406450 Bytes symbol space free

    2 Warning Errors
    4 Severe Errors

    说明这个程序有错误,并在第3,4,16,19,23行有错,
    我们再执行PROCEDURE c去逐一检查
    第三行:3 ax db 'My name is DJX'
    它的错误在于AX不能作为变量名,更正:
    3 out2 db 'My name is DJX'
    注意刚才我们定义AX为变量时在后面的程序中用过'变量AX'在第19行
    19 lea dx,ax
    在出错报告中也报第19行错,因为不能将AX的有效地址赋给DX,更正:
    19 lea dx,out2
    这样一下就解决了两个错误
    第四行:4 data ens
    这行为一个段的结束,但语句漏打了字母,更正:
    4 data ends
    第十六行:16 moo ah,2
    这行也是语句打错,更正:
    16 mov ah,2
    第二十三行:
    出错信息:error.ASM(23): warning A4085: End of file, no END directive
    说明本程序没有结束伪操作,更正:
    加入:在第七、八行加入地址标志: start:
    原23 end start

    执行PROCEDURE a将源程序修改如下:

    data segment
    out1 db 'Hello world'
       
     
       

    4 汇编语言上机指导及例示
     
    out2 db 'My name is DJX'
    data ends

    code segment
    assume cs:code;ds:data
    start:
    lea dx,out1
    mov ah,2
    int 21h

    mov dl,0ah
    mov ah,2
    int 21h
    mov dl,0dh
    mov ah,2
    int 21h

    lea dx,out2
    mov ah,9
    int 21h
    code ends
    end start

    再次进行PROCEDURE b进行编译,屏幕显示:

    Microsoft (R) Macro Assembler Version 5.00
    Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.

    Object filename [error.OBJ]:
    Source listing [NUL.LST]:
    Cross-reference [NUL.CRF]:
    51524 + 406492 Bytes symbol space free

    0 Warning Errors
    0 Severe Errors

    本程序在语句上已无错误。
    再执行PROCEDURE d连接为可执行文件(link error回车),屏幕显示:

    Microsoft (R) Overlay Linker Version 3.60
    Copyright (C) Microsoft Corp 1983-1987. All rights reserved.

    Run File [ERROR.EXE]:
    List File [NUL.MAP]:
    Libraries [.LIB]:
    LINK : warning L4021: no stack segment

    这时error.exe可执行文件已存在,可以执行PROCEDURE e来运行看一看是否正确
    在dos提示符下键入:error回车(小心!!!)
    屏幕显示:乱码,并死机。reset My computer!
    说明程序在逻辑上有错误,并且严重。
    这是就要用PROCEDURE f,用调试工具调试,查找错误。
    在DOS提示符下键入:debug error.exe回车
    屏幕出现 - 提示符,这时就可以用DEBUG的命令来找错误了,
    我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据段后,所定义的变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:后面加上如下指令:(执行PROCEDURE a)
    mov ax,data
    mov ds,ax
    再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,
    屏幕显示:
    换行
    My name is DJX及乱码,并死机。(又要重新启动!)
    再次执行PROCEDURE a检查程序,发现:
    1.汇编语言有规定每个字符串应由$结尾
    2.在输出第一个串的语句中的AH子功能号应为09H
    将以上两点改正。
    再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,
    屏幕显示:
    Hello world
    My name is DJX并死机,不能返回DOS
    原因分析,在程序中没有返回DOS的指令,更正:
    用PROCEDURE a来进行编辑:
    用DOS 21H中断的4cH子功能便可返回DOS,在code ends前加:
    mov ah,4ch
    int 21h
    再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,
    屏幕显示:
    Hello word
    My name is DJX
    并返回DOS
    成功!
    这样一个程序就调试完成,并正确。
    下面是正确的源程序:

    data segment
    out1 db 'Hello world$'
    out2 db 'My name is DJX$'
    data ends

    code segment
    assume cs:code;ds:data
    start:
    mov ax,data
    mov ds,ax

    lea dx,out1
    mov ah,9
    int 21h

    mov dl,0ah
    mov ah,2
    int 21h
    mov dl,0dh
    mov ah,2
    int 21h

    lea dx,out2
    mov ah,9
    int 21h

    mov ah,4ch
    int 21h
    code ends
    end start

    以上这个程序很简单,只是为了说明实现汇编语言的上机编程及调试过程,汇编语言须多练习才能掌握它的特点,以便顺利通过考试
    展开全文
  • TABLE DW 10H,20H,30H,40H,50H BUF DW 4 ┇ LEA BX,TABLE ADD BX,BUF MOV AX,[BX] ┇ 要求: (1)将以上程序段补充成完整的汇编源程序,并调试运行。 (2)将以上程序段中的 TABLE DW 10H,20H,30H,40H,50H ...

    1、已知有以下变量定义,请将各变量分别放在源程序中进行调试,观察为每变量所分配的存储 空间及初始化的数据值
    (1)BR DB ‘Hello’,68,-20,3 DUP(4)
    (2)WR DW 3456H,0AFH,0A123H,-30
    (3)X DW1,2,$ +4,3,4,$ +4
    要求:分析、观察变量的数据分配,记录变量存储情况。

    在这里插入图片描述
    DB定义一个字节单元,‘Hello’每个字符占一个字节单元,68的十六进制为44,-20的原码为10010100,它的补码为11101100,转化为十六进制为EC,DUP()重复定义三个字节单元,都存储04。(2)(3)同理;

    2、执行下列指令后,AX 寄存器中的内容是什么?

    TABLE DW 10H,20H,30H,40H,50H  
    BUF DW 4
    	   ┇  
     LEA BX,TABLE  
     ADD BX,BUF  
     MOV AX,[BX]  
    	   ┇ 
    

    要求:
    (1)将以上程序段补充成完整的汇编源程序,并调试运行。
    (2)将以上程序段中的 TABLE DW 10H,20H,30H,40H,50H 修改为 TABLE DW 10,20,30,40,50,再补充成完整的汇编程序并调试运行,观察并记录 AX 的内容。

    源代码:

    DATA SEGMENT
    	TABLE DW 10H,20H,30H,40H,50H
    	BUF DW 4
    DATA ENDS
    CODE SEGMENT
    	ASSUME CS:CODE,DS:DATA
    START:
    	MOV AX,DATA
    	MOV DS,AX
    	LEA BX,TABLE
    	ADD BX,BUF
    	MOV AX,[BX]
    	MOV AH,4CH
    	INT 21H
    CODE ENDS
    	END START
    
    

    在这里插入图片描述

    修改之后:
    在这里插入图片描述

    展开全文
  • 51单片机keil汇编语言学习实验报告,后续还会接着上传,免费下载
  • 汇编语言上机大作业

    2020-07-31 23:17:23
    大作业题目 编一开奖程序,打开并读取文件中的数据,计算参会人数N,利用BIOS的1AH时钟中断产生一随机数M(1~N之间),根据该随机数确定本次中奖人员为文件中的第M个人,并在屏幕上显示该幸运数和中奖学号。...
  • 汇编语言上机实验2 5.4 试编写一个程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息: (1) 如果三个数都不相等则显示0; (2) 如果三个数有两个相等则显示1; (3) 如果三个数都相等则...
  • 在我的Visual Studio专栏中有一篇文章介绍Visual Studio搭建汇编语言环境并使用AsmDude插件实现代码高亮。 本地windows调试器,启动! 折腾了一下午,原因找到了:8086微机使用的16位系统,而VS环境是32位的,一个...
  • 汇编语言上机指导及例示[转]

    千次阅读 2007-03-17 14:45:00
    由于本人水平有限,在下文在如有错误及可以进一步修改的地方请大家指出 汇编语言上机过程: 一、上机前的软件准备: MS-DOS操作系统(如:MSDOS6.22 , MSDOS7.0 等) 文本编辑器 (如:EDIT.COM , TURBO.EXE , ...
  •  (2)熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。  2. 实验内容 (1)编写一个子程序计算z=f(x,y)=x/y+x-y(x,y,z有符号数内存字数)。要求通过堆栈传送输入参数,输出参数通过...
  • 汇编语言上机与DOSBox 0.74安装过程

    千次阅读 2017-11-08 16:58:58
    1. 有两个数(字数据)DATA1和DATA2,把两数...本人意不在汇编,无奈老师也相对讲的听不懂。 另附上DOSBox0.74的安装过程及其编译调试过程,无奈老师甩给我们一个文件,什么也没有说就走了,望天下同学自觉自立 ...
  • 题目 assume cs:code,ds:data data segment buf1 db 'This is a plain text' cnt1 equ $-buf1 buf2 db 'ABXmv#7' cnt2 equ $-buf2 buf3 db 100 dup (?) data ends code segment start: ......
  • 题目 ASSUME CS:CODES,DS:DATAS DATAS SEGMENT YES db 'YES','$' NO db 'NO','$' BUF dw 3 DATAS ENDS CODES SEGMENT ;MAIN PROC FAR START: MOV AX,DATAS MOV DS,AX MOV BX,...
  • 题目 不停循环加密key的同时,扫描key中的每个字符串 ASSUME CS:CODES,DS:DATAS DATAS SEGMENT BUF1 DB'ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ' COUNT1 EQU $-BUF1 BUF2 DB -2,4,1,0,-3,5,2,-4,...
  • 汇编程序发现这是堆栈段,执行的时候会直接使SSTACK -> SS DB 200H DUP(0) SSTACK ENDS CODE SEGMENT ASSUME DS:DATA, ES:DATA, SS:SSTACK, CS:CODE ;DATA(DATA SEGMENT) ;ES(EXTRA DATA SEGMENT) ;SSTACK ->...
  • http://tech.ddvip.com/2006-12/116495407512668_7.html

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 278
精华内容 111
关键字:

汇编语言上机