第三章 汇编语言程序设计第三章 汇编语言程序设计 概述概述 汇编语言程序的格式汇编语言程序的格式 伪操作命令伪操作命令 DOS 和和BIOS调用调用 汇编语言程序设计举例汇编语言程序设计举例 汇编程序的功能及汇编过程汇编程序的功能及汇编过程 调试程序调试程序 DEBUG include stdio h void main int a b c a 1 b 2 c a b printf c d n c 用C语言编程实现 c a b 并在屏幕上显示出结果 用C语言编程实现 c a b 并在屏幕上显示出结果 例例例例1 1 编译后的目标文 件达到 编译后的目标文 件达到3 59KB data segmentdata segment a db b db c db string db c a db b db c db string db c data ends code segment data ends code segment main proc far assume cs code ds data es data start push ds sub ax ax push ax movax data movds ax moves ax mova 1 movb 2 moval a add al b movc al lea dx string movah 09 int21h add c 30h movdl c movah 2 int21h movdl 0ah int21h movdl 0dh int21h ret main endp main proc far assume cs code ds data es data start push ds sub ax ax push ax movax data movds ax moves ax mova 1 movb 2 moval a add al b movc al lea dx string movah 09 int21h add c 30h movdl c movah 2 int21h movdl 0ah int21h movdl 0dh int21h ret main endp code endscode ends end startend start 例 2 C a b例 2 C a b 汇编后的目 标文件只有 208字节 汇编后的目 标文件只有 208字节 第一节 概述第一节 概述 优点 可以直接被计算机识别 执行速度快 占用内存空间少 缺点 不直观 编写 阅读和修改都很繁琐 优点 可以直接被计算机识别 执行速度快 占用内存空间少 缺点 不直观 编写 阅读和修改都很繁琐 优点 执行速度较快 占用内存空间较少 编写 阅读和修改比较方便 缺点 面向机器的语言 通用性差 优点 执行速度较快 占用内存空间较少 编写 阅读和修改比较方便 缺点 面向机器的语言 通用性差 优点 编写 阅读和修改比较方便 通用性好 缺点 执行速度慢 占用内存空间大 优点 编写 阅读和修改比较方便 通用性好 缺点 执行速度慢 占用内存空间大 机器语言 机器语言 汇编语言 汇编语言 高级语言 高级语言 第二节 汇编语言程序的格式第二节 汇编语言程序的格式 一 分段结构一 分段结构 二 汇编语言语句的类型和组成二 汇编语言语句的类型和组成 1 指令性语句指令性语句 标号 前缀指令 助记符 操作数 注释 标号 前缀指令 助记符 操作数 注释 语句中凡带 的项为任选项语句中凡带 的项为任选项 书写时不能加 书写时不能加 1 标号段 标号是指令性语句的标识符 标号段 标号是指令性语句的标识符 命名原则 由字母打头 后跟字母或数字 命名原则 由字母打头 后跟字母或数字 0 9 及某些特殊符号 及某些特殊符号 等等 字符个数不超过 字符个数不超过31个 不能使用保留字和关键字 个 不能使用保留字和关键字 标号后用标号后用 作为分界符 可以作为转移指令 过程调 用等的操作数 作为分界符 可以作为转移指令 过程调 用等的操作数 2 前缀指令段 前缀指令段 有些指令语句 需在指令助记符前加前缀指令 如有些指令语句 需在指令助记符前加前缀指令 如LOCK REP 等 以空格与指令助记符隔开 等 以空格与指令助记符隔开 3 指令助记符段 指令助记符段 为指令操作码规定的符号 是指令不可缺少的部分 为指令操作码规定的符号 是指令不可缺少的部分 4 操作数段 操作数段 可有可无 两个操作数间用可有可无 两个操作数间用 隔开 隔开 操作数和助记符间用空格隔开 操作数和助记符间用空格隔开 2 指示性语句指示性语句 指示性语句又简称为伪指令 它只是在汇编过程中告诉汇编 程序应如何汇编 并没有实际的操作码与之对应 指示性语句又简称为伪指令 它只是在汇编过程中告诉汇编 程序应如何汇编 并没有实际的操作码与之对应 可有可无 如有名字 可有可无 如有名字 1 书写时不加 书写时不加 2 名字后无 名字后无 3 名字后用空格与助记符分开 命名规则同指令语句中标号 名字后用空格与助记符分开 命名规则同指令语句中标号 格式 格式 名字 助记符 操作数 注释 名字 助记符 操作数 注释 是伪指令的关键 字 也是汇编语言 规定的一组符号 是伪指令的关键 字 也是汇编语言 规定的一组符号 三三 操作数操作数 1 常数 常数 在指令码中直接给出 不需要使用寄存器 也不涉及数据 区的操作 只能作为源操作数 在指令码中直接给出 不需要使用寄存器 也不涉及数据 区的操作 只能作为源操作数 数字型常量二进制 十进制 八进制 十六进制数 数字型常量二进制 十进制 八进制 十六进制数 例 例 1011 0110B 78 67O 9BH 注 对于十六进制数 如第一位数字为字母时 必 须在首位补 注 对于十六进制数 如第一位数字为字母时 必 须在首位补 0 如 如 0A4 H 以避免与标识符混淆 以避免与标识符混淆 字符型常量 字符型常量 字符型常量是指由单引号括起来的一串字符 在汇编时以字符型常量是指由单引号括起来的一串字符 在汇编时以 ASCII码形式存放在内存单元 码形式存放在内存单元 例 例 ABC 1234 对应对应ASCII 码 码 41H 42H 43H 31H 32H 33H 34H 字符串最长为字符串最长为255个字符个字符 2 标号 标号 标号有三种属性 段属性 偏移属性 类型属性 标号有三种属性 段属性 偏移属性 类型属性 段属性 段属性 标号所在指令在哪一个段中 用段地址表示 标号所在指令在哪一个段中 用段地址表示 偏移属性 偏移属性 标号所在指令在段内的偏移量 用偏移地址表示 标号所在指令在段内的偏移量 用偏移地址表示 类型属性 类型属性 NEAR 具有此属性的标号必须与转移指令在同一个段内 具有此属性的标号必须与转移指令在同一个段内 FAR 具有此属性的标号可以与转移指令不在同一个段内 具有此属性的标号可以与转移指令不在同一个段内 3 变量 变量 变量代表某组数据中第一项数据的内存单元地址 有三种 属性 段属性 偏移属性 类型属性 变量代表某组数据中第一项数据的内存单元地址 有三种 属性 段属性 偏移属性 类型属性 例 例 DS1 DB 35H 6FH DS2 DW 1A3H 4560H MOV AL DS1 MOV BX OFFSET DS1 变量名变量名 4 由寻址方式给出的寄存器或存储器操作数 由寻址方式给出的寄存器或存储器操作数 寄存器操作数 寄存器操作数 十六位通用寄存器十六位通用寄存器AX BX CX DX BP SP SI DI 8位通用寄存器位通用寄存器AH AL BH BL CH CL DH DL 段寄存器段寄存器CS SS DS ES 存储器操作数 存储器操作数 由第二章介绍的直接寻址 寄存器间址等各种寻址方式给 出的存储器操作数 都是汇编语言中的有效操作数 由第二章介绍的直接寻址 寄存器间址等各种寻址方式给 出的存储器操作数 都是汇编语言中的有效操作数 5 表达式 表达式 表达式是由常数 标号 变量及各种寻址方式表示的 操作数经运算符组合而成的 例 表达式是由常数 标号 变量及各种寻址方式表示的 操作数经运算符组合而成的 例 MOV AX 35 2 10 7 MOV BX PORT LT 5 注 表达式是在汇 编时处理的 注 表达式是在汇 编时处理的 如如POPT 5 指令汇编成指令汇编成 MOV BX 0FFFFH 否则否则 汇编成汇编成 MOV BX 0 数值表达式 产生一个数值结果 只有大小 没有属性 数值表达式 产生一个数值结果 只有大小 没有属性 地址表达式 表示存储器地址的变量和标号 有地址表达式 表示存储器地址的变量和标号 有3种属性 种属性 表达式中常用的运算符表达式中常用的运算符 在汇编语言程序设计中 常用的运算符有在汇编语言程序设计中 常用的运算符有5种 算术运算符 关系运算符 逻辑运算符 分析运算符及合成运算符 种 算术运算符 关系运算符 逻辑运算符 分析运算符及合成运算符 1 算术运算符 算术运算符 加 加 减 减 乘 乘 除 以及 除 以及MOD 取余 取余 5种种 MOD 求余操作 求余操作 例 例 26 MOD 4 结果为结果为 2 如果表达式为数值表达式 五种算术运算符都可以使用 如果表达式为数值表达式 五种算术运算符都可以使用 如果表达式为地址表达式 有意义的运算符是如果表达式为地址表达式 有意义的运算符是 和和 2 逻辑运算符 逻辑运算符 AND 与 与 OR 或 或 XOR 异或 异或 NOT 非 非 4种 种 逻辑运算符的操作数只能是数字 结果也为数字 逻辑运算符的操作数只能是数字 结果也为数字 只用于数值表达式中对数值进行逻辑运算 运算结果为一个数值 对地址进行逻辑运算无意义 只用于数值表达式中对数值进行逻辑运算 运算结果为一个数值 对地址进行逻辑运算无意义 例 例 AND AL 10010001B MOV AL 11010000B AND 1111 1111B 1101 0000B AL 3 关系运算符 关系运算符 EQ 相等 相等 NE 不等 不等 LT 小于 小于 GT 大于 大于 LE 小于等于 小于等于 GE 大于等于 大于等于 6种种 关系运算符连接的两个操作数 必须都是数字的或是同一逻辑段 中的存储器地址 关系运算符连接的两个操作数 必须都是数字的或是同一逻辑段 中的存储器地址 关系为真 结果为关系为真 结果为 0FFFFH 关系为假 结果为关系为假 结果为 0 例 例 MOV BX 4EQ3 0 BX MOV BX 4NE3 0FFFFH BX 4 分析运算符及合成运算符 分析运算符及合成运算符 分析运算符用于分析存储器操作数的属性分析运算符用于分析存储器操作数的属性 段 偏移 类型段 偏移 类型 合成运算符用于规定存储器操作数的属性 合成运算符用于规定存储器操作数的属性 类型类型 常用的分析运算符表达式如下表所示 常用的分析运算符表达式如下表所示 带分析运算符的表达式带分析运算符的表达式表达式的意义表达式的意义 OFFSET 变量名或标号变量名或标号 SEG 变量名或标号变量名或标号 TYPE 变量名或标号变量名或标号 LENGTH 变量名变量名 SIZE 变量名变量名 取出变量或标号所在段的偏移地址取出变量或标号所在段的偏移地址 取出变量或标号所在段的段基址取出变量或标号所在段的段基址 取出变量或标号的类型取出变量或标号的类型 取出变量的长度取出变量的长度 取出变量的大小取出变量的大小 例例 MOV BX OFFSET DATA3 MOV AX SEG DATAZ MOV DS AX 取 取DATA3地址偏移量给地址偏移量给BX 取 取DATAZ的段基址给的段基址给AX 类型运算符类型运算符TYPE用来说明变量名或标号所代表存储单元的类型 用来说明变量名或标号所代表存储单元的类型 字节类型 对应值为字节类型 对应值为1 字类型 对应值为字类型 对应值为2 双字类型 对应值为双字类型 对应值为4 变量的类型是由伪指令变量的类型是由伪指令 DB DW DD定义的定义的 例 例 VAR DW ARRAY DD 10DUP STR DB AB MOV AX TYPE VAR MOV BX TYPE ARRAY MOV CX TYPE STR AX 2 BX 4 CX 1 运算符运算符LENGTH 变量中使用变量中使用 DUP 值为分配给该变量的单元数 可以以字 节 字或双字为单位 其它情况 值为 值为分配给该变量的单元数 可以以字 节 字或双字为单位 其它情况 值为1 例 例 FEES DW 100 DUP 0 LENGTH FEES 100 ARRAY DW 1 2 3 LENGTH ARRAY 1 运算符运算符SIZE 用来计算一个变量存储区所占用的字节数 此值为用来计算一个变量存储区所占用的字节数 此值为LENGTH值 和 值 和TYPE值的乘积 值的乘积 例 例 SIZE FEES 200 SIZE ARRAY 2 合成运算符合成运算符PTR 格式 类型格式 类型 PTR 表达式表达式 可以是可以是BYTE WORD DWORD NEAR FAR 可以是标号 变量或用各种 寻址方式表示的地址表达式 可以是标号 变量或用各种 寻址方式表示的地址表达式 例 例 MOV WORD PTR BX 0 JMP NEAR PTR ROAT 合成运算符合成运算符THIS 格式 格式 THIS 类型类型 功能 可以指定存储器操作数的类型 使用功能 可以指定存储器操作数的类型 使用THIS可以使标 号或变量的类型具有灵活性 可以使标 号或变量的类型具有灵活性 例 例 FIRST EQU THIS BYTE SECOND DW 100 DUP 0 FIRST 和和SECOND的地址相同 但的地址相同 但FIRST为字节类型 为字节类型 SECOND为字类型 为字类型 SHORT 功能 用来指定一个标号的类型为功能 用来指定一个标号的类型为SHORT 短标号短标号 地址运算符地址运算符 段超越运算符 段超越运算符 HIGH和和LOW HIGH和和LOW分别用来得到一个数值和地址 表达式的高位和低位字节 分别用来得到一个数值和地址 表达式的高位和低位字节 例 例 STUFF EQU 0ABCDH MOV AH HIGH STUFF MOV AL LOW STUFF 第二节 伪指令第二节 伪指令 伪指令又称汇编命令语句 伪指令又称汇编命令语句 常用伪指令有 常用伪指令有 符号定义 数据定义 过程定义 段定义 源程序结束 符号定义 数据定义 过程定义 段定义 源程序结束 一 符号定义伪指令一 符号定义伪指令 一 等值语句 一 等值语句 EQU EQU 语句给符号名定义一个值 或定义成别的符号名 甚至可定义为一条可执行的指令等 语句给符号名定义一个值 或定义成别的符号名 甚至可定义为一条可执行的指令等 格式 格式 NAME EQU 表达式表达式 可以是一个常数 地址表达式等 可以是一个常数 地址表达式等 例 例 XX EQU 2010H BUF EQU 55H ADS EQU BX 80H LOD EQU MOV 定义之后 则指令定义之后 则指令 LOD AL BUF 等价于等价于 MOV AL 35H 注 注 EQU语句在未解 除前 不能重新定义 语句在未解 除前 不能重新定义 二 等号语句 二 等号语句 此语句的功能与此语句的功能与EQU类似 但可以对符号进行再定义 类似 但可以对符号进行再定义 例 例 EYP 5 EYP 20 三 解除语句 三 解除语句 PUREG 已经用已经用EQU 定义过的符号 若已无用 可用定义过的符号 若已无用 可用PUREG语句来解 除 语句来解 除 格式 格式 PUREG 符号符号1 符号 符号2 符号 符号3 用用PUREG 解除了的符号 可以重新定义 解除了的符号 可以重新定义 例如 例如 ABC EQU 1000H PUREG XYZ ABC ABC EQU 2100H 二 数据定义语句二 数据定义语句 数据定义语句为变量分配存储单元 变量名与第一个存 储单元相联系 数据定义语句为变量分配存储单元 变量名与第一个存 储单元相联系 变量名变量名 DB 表达式 变量名 表达式 变量名 DW 表达式 变量名 表达式 变量名 DD 表达式 变量名 表达式 变量名 DQ 表达式 变量名 表达式 变量名 DT 表达式表达式 语句格式语句格式 定义字节数据 定义字数据 定义双字数据 定义长字数据 定义十字节数据 定义字节数据 定义字数据 定义双字数据 定义长字数据 定义十字节数据 表达式的形式有以下几种表达式的形式有以下几种 1 一个或多个常数或运算式 可求值且为常数 一个或多个常数或运算式 可求值且为常数 当有多个常数或算式时 用逗号隔开 当有多个常数或算式时 用逗号隔开 例 例 XX DB 1 2 3 4 2 带引号的字符串 带引号的字符串 字符串必须用单引号括住 字符串的字符不得超过字符串必须用单引号括住 字符串的字符不得超过255个 例 个 例 KK DB 12 3 内存分配 内存分配 31H 32H 33H 地 址 递 增 地 址 递 增 KK 1 2 3对 应 对 应ASCII码码 3 用问号 作为表达式 用问号 作为表达式 可用于 可用于DB DW DD语句的表达式中 其作用 是给变量分配存储单元 不赋初值 语句的表达式中 其作用 是给变量分配存储单元 不赋初值 例 例 SMM DW 预留一个字 预留一个字 SDD DB 2个字节 个字节 预留一个字节 预留一个字节 4 带 带 DUP 重复方式 表达式 重复方式 表达式 格式格式 重复次数 重复次数 DUP 表达式 表达式 功能 圆括号内的表达式重复预置 重复次数由功能 圆括号内的表达式重复预置 重复次数由 DUP 前的 常数决定 前的 常数决定 例 例 TTA DB 50 DUP 0 TTB DW 100 DUP TTC DB 10 DUP ABC 0BH 内存分 配 内存分 配 TTA0 0 TTC 41H 42H 43H 0BH TTB 50个 字节 个 字节 100个字个字 200个存 储单元 个存 储单元 重复重复10次 共预置 次 共预置40 个存储单 元 个存储单 元 注 注 TTC接接TTB 地址连续地址连续 DUP 也可重叠使用也可重叠使用 例 例 TTD DB 3 DUP 0 5 DUP 1 相当于相当于 TTD DB 3 DUP 0 1 1 1 1 1 5 地址表达式 只能用于 地址表达式 只能用于DW或或DD 1 用 用DW定义时 把操作数的偏移地址赋给变量 定义时 把操作数的偏移地址赋给变量 A1 DW VALUE 定义 定义A1为为VALUE的偏移地址的偏移地址 2 用 用DD定义时 低位字用于预置偏移地址 高位字用于预置定义时 低位字用于预置偏移地址 高位字用于预置 段地址段地址 A2 DD VALUE A2的高位字为的高位字为VALUE的段地址 低位字为的段地址 低位字为VALUE的偏移地址的偏移地址 3 操作数中的变量与标号可与常数相加减 相当于偏移地址 加减常数 段地址不变 操作数中的变量与标号可与常数相加减 相当于偏移地址 加减常数 段地址不变 4 变量与变量 标号与标号不能相加 可相减 结果为纯数 值 变量与变量 标号与标号不能相加 可相减 结果为纯数 值 例 例 ZERO DB 0 ONE DW 1234H 5678H TWO DW ZERO THREE DD TWO FOUR DB TWO ONE 0 34H 12H 78H 56H 00H 01H 05H 01H 00H 05H 04H 0500H 0100H ZERO ONE TWO THREE FOUR 变量的使用 变量的使用 MOV AL ZERO MOV AL ZERO 关于变量的使用 关于变量的使用 1 变量的类型必须与指令的要求相符 变量的类型必须与指令的要求相符 例 例 MOV AL ONE 错错 MOV AX ONE 对对 2 变量对应于第一个数据项 其它数据项应用地址表达式或 变量对应于第一个数据项 其它数据项应用地址表达式或 其它寻址方式 其它寻址方式 例 例 MOV AX ONE 2 MOV BX OFFSET ONE MOV AX BX 2 三 段定义语句三 段定义语句 1 SEGMENT ENDS 伪指令伪指令 成对使用 用来指定段的名称和范围 成对使用 用来指定段的名称和范围 段的标识符 命名规则 同变量 标号等 段的标识符 命名规则 同变量 标号等 格式 格式 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDS 本段程序内容 指令或伪指令 本段程序内容 指令或伪指令 一致一致 任选项告诉汇编程序和连接程序如何确定段的边界 以及如何任选项告诉汇编程序和连接程序如何确定段的边界 以及如何 组合几个不同的段等 组合几个不同的段等 2 ASSUME 伪指令伪指令 ASSUME 伪指令用来告诉汇编程序逻辑段和物理段之间 的关系 格式 伪指令用来告诉汇编程序逻辑段和物理段之间 的关系 格式 ASSUME 段寄存器名 段名符段寄存器名 段名符 段寄存器名 段名符 段寄存器名 段名符 内的内容可有可无内的内容可有可无 例 例 ASSUME CS CODE DS DATA SS STACK 注意 注意 1 ASSUME 语句必须安排在代码段内 一般应放在代码段之 首 语句必须安排在代码段内 一般应放在代码段之 首 2 ASSUME伪操作只是通知汇编程序有关段寄存器与逻辑段的伪操作只是通知汇编程序有关段寄存器与逻辑段的 关系 并没有给段寄存器赋予实际的初值 关系 并没有给段寄存器赋予实际的初值 例 例 MYDATASEGMENT XX1DB XX2DW XX3DD MYDATAENDS MYEXTRASEGMENT YY1DB 25H 36H YY2DW MYEXTRA ENDS MYSTACKSEGMENT STADW 100 DUP TOPEQU LENGTH STA MYSTACK ENDS MYCODE SEGMENT ASSUME CS MYCODE ASSUME DS MYDATA ASSUME ES MYEXTRA ASSUME SS MYSTACK START MOV AX MYDATA MOV DS AX MOV AX MYSTACK MOV SS AX MOV AX MYEXTRA MOV ES AX MOV AX TOP MOV SP AX MYCODE ENDS END START 数 据 段 数 据 段 附 加 段 附 加 段 堆 栈 段 堆 栈 段 说明各 逻辑段 的性质 说明各 逻辑段 的性质 为各段 寄存器 装实际 值 为各段 寄存器 装实际 值 设堆栈指针 设堆栈指针 3 ORG 伪指令伪指令 ORG伪指令用来规定某程序段的起始地址 伪指令用来规定某程序段的起始地址 格式 格式 ORG 表达式 表达式 DATA SEGMENT ORG 2000H ST1DB 10H 20H 30H LENGTH EQU ST1 ST2DW ORG 4000H ST3DW 123H 456H DATA ENDS 从数据区从数据区2000H单 元开始存放 单 元开始存放 从从4000H单元 开始存放 单元 开始存放 四 过程定义语句四 过程定义语句 过程调用及返回均分为两种情况 过程调用及返回均分为两种情况 段内段内及及段间段间 调用指令调用指令 CALL 返回指令 返回指令 RET 段内的调用及返回指令只将段内的地址偏移量入栈或弹 出 段间的调用与返回指令需将段基址和段内偏移量都入 栈保护或弹出 段内的调用及返回指令只将段内的地址偏移量入栈或弹 出 段间的调用与返回指令需将段基址和段内偏移量都入 栈保护或弹出 过程定义伪指令过程定义伪指令PROC 和和ENDP 成对出现 两条伪指令之间的内容为一个过程 即一个 子程序 成对出现 两条伪指令之间的内容为一个过程 即一个 子程序 格式 过程名 格式 过程名PROC NEAR FAR RET 过程名过程名ENDP 必须有且一致必须有且一致 类型说明符 说 明过程的属性 段内或段间 类型说明符 说 明过程的属性 段内或段间 如为如为NEAR属 性 可省略 属 性 可省略 子程序子程序 例 例 MYCOCDSEGMENT XXPROC NEAR DEC CX RET XXENDP START MOV CX 0FFAH CALL XX MYCOCDENDS END START 定义定义XX为为 NEAR属性属性 汇编为段内 返回 汇编为段内 返回 汇编为段内 调用 汇编为段内 调用 NAME1 PROC FAR CALL NAME2 RET NAME2 PROC NEAR RET NAME2 ENDP NAME1 ENDP 过程的定义和调用均可以嵌套 过程的定义和调用均可以嵌套 五 结束语句五 结束语句 标志着整个源程序的结束 标志着整个源程序的结束 格式为 格式为 END DATASEGSEGMENT XX1DW 1234H YY1DW 4567H SULTDW DATASEGENDS CODESEGSEGMENT ASSUME CS CODESEG DS DATASEG START MOV AX DATASEG MOV DS AX MOV AX XX1 SUB AX YY1 MOV SULT AX CODESEGENDS END START 第三节汇编程序的功能及汇编过程第三节汇编程序的功能及汇编过程 一 汇编程序的功能一 汇编程序的功能 汇编程序的功能是将用汇编程序编写的源程序翻译成 机器语言表示的目标程序 汇编程序的功能是将用汇编程序编写的源程序翻译成 机器语言表示的目标程序 汇编语言源 程序文件 汇编语言源 程序文件 ASM 汇编程序汇编程序 MASM 或或ASM 目标代码文件目标代码文件 列表文件列表文件 交叉索引文件交叉索引文件 Obj lst crf 输入 翻译 输出 输入 翻译 输出 二 源程序的编辑 汇编及链接二 源程序的编辑 汇编及链接 1 源程序的建立 源程序的建立 在编辑软件支持下进行 常用的有在编辑软件支持下进行 常用的有EDIT 在 在 WINDOWS下也可使用记事本 下也可使用记事本 生成的汇编语言源程序需带扩展名生成的汇编语言源程序需带扩展名 ASM 2 汇编及链接方法汇编及链接方法 设文件存于设文件存于 C 盘盘 MASM 子目录下 文件名为子目录下 文件名为 YS ASM 编译格式 编译格式 C MASM MASM YS 链接格式 链接格式 C MASM LINK YS 若无错若无错 生成可执行文件生成可执行文件 YS EXE 运行可在 运行可在DOS 和和 Windows 下运行 下运行 DOS 下运行格式 下运行格式 C MASM YS 汇编语言上机过程 汇编语言上机过程 用编辑程序建立 用编辑程序建立 ASM 源程序文件 源程序文件 用 用 MASM 程序把程序把 ASM 文件编译成文件编译成 OBJ 文件 文件 用 用LINK 程序把程序把 OBJ 文件链接成文件链接成 EXE 文件 文件 用 用DOS 命令直接键入文件名就可执行文件 命令直接键入文件名就可执行文件 为保证程序执行完后能正确返回为保证程序执行完后能正确返回 PC DOS 采取以下措施 采取以下措施 将用户程序的主程序定义成一个将用户程序的主程序定义成一个FAR过 程 最后一条指令为 过 程 最后一条指令为RET 在主程序开始部分用以下在主程序开始部分用以下 3 条指令将条指令将 PSP 中的中的 INT 20H 指令的段基址及偏移地址压入堆栈 指令的段基址及偏移地址压入堆栈 PUSH DS MOV AX 0 PUSH AX 主程序执行完毕 返回时 存在栈 内的两个字弹出给 主程序执行完毕 返回时 存在栈 内的两个字弹出给IP 和和 CS 使 使 INT 20H 指令执行 回到指令执行 回到 PC DOS 状态状态 程序与程序与DOS的接口的接口 PC DOS环境下环境下8086 8088源程序的基本框架源程序的基本框架 DATASEGMENT DATAENDS STACK SEGMENT STACK ENDS CODESEGMENT MAENPROC FAR ASSUME CS CODE DS DATA SS STACK MAIN PUSH DS MOV AX 0 PUSH AX MOV AX DATA MOV DS AX RET MAENENDP 续 续 PROCAPROC NEAR PROCA ENDP CODE ENDS END MAIN 设置数据段 预置数据 设置数据段 预置数据 设置堆栈段设置堆栈段 与与PC DOS 接口接口 设置段寄存器值设置段寄存器值 过程过程 其它过程其它过程 MOV AH 4CH INT 21H 另一种与另一种与DOS接口的方法 使用编号为接口的方法 使用编号为 4CH 的功能调用 返回 的功能调用 返回 DOS 汇编语言源程序格式举例 2 汇编语言源程序格式举例 2 DATASEGMENT DATAENDS CODESEGMENT MAENPROC FAR ASSUME CS CODE DS DATA MAIN MOV AX DATA MOV DS AX MOV AH 4CH INT 21H MAENENDP CODEENDS END MAIN 注 可以不定义堆栈段 由 操作系统为程序分配堆栈段 注 可以不定义堆栈段 由 操作系统为程序分配堆栈段 第五节IBM PC DOS 系统功能的调用第五节IBM PC DOS 系统功能的调用 一 概述一 概述 PC DOS 是是 IBM PC 系列微机的磁盘操作系统 系列微机的磁盘操作系统 1 普通用户从键盘输入普通用户从键盘输入DOS命令命令 由由COMMAND COM模块接收 识别 处理 模块接收 识别 处理 2 高级用户通过用户程序去调用高级用户通过用户程序去调用DOS和和BIOS中的服务程序 中的服务程序 使用使用DOS的方式 的方式 用户程序控制用户程序控制PC机硬件的方式 机硬件的方式 使用高级语言提供的功能控制硬件 使用高级语言提供的功能控制硬件 使用使用DOS提供的程序控制硬件 提供的程序控制硬件 使用使用BIOS提供的程序控制硬件 提供的程序控制硬件 直接访问硬件直接访问硬件 DOS系统功能调用系统功能调用 INT 21H 设备管理 键盘输入 显示器输出等 目录管理 查找文件 文件改名等 文件管理 打开 关闭 读 设备管理 键盘输入 显示器输出等 目录管理 查找文件 文件改名等 文件管理 打开 关闭 读 写文件等 其它 分配内存 置 写文件等 其它 分配内存 置 取日期与时间等 四 大 功 能 取日期与时间等 四 大 功 能 二 系统功能调用方法二 系统功能调用方法 DOS 功能调用共功能调用共 87 个子程序 编号从个子程序 编号从 0 57H 使用时应包括以下内容 使用时应包括以下内容 入口参数 子程序编号送 入口参数 子程序编号送AH INT 21H 子程序请 求中断指令 子程序请 求中断指令 有的子程序不需要入口参数 但大部分子程序需要 将参数送入指定位置 有的子程序不需要入口参数 但大部分子程序需要 将参数送入指定位置 三 基本 I O 功能调用三 基本 I O 功能调用 1 键盘输入 键盘输入 1号调用 号调用 1号调用等待从标准设备输入一个字符并送入寄存器号调用等待从标准设备输入一个字符并送入寄存器 AL 不需入口参数 不需入口参数 例 例 MOV AH 1 INT 21H 指令的执行 系统等待有键按下 一旦有键按下 将键值 相应 指令的执行 系统等待有键按下 一旦有键按下 将键值 相应ASCII 码 读入 先检查是否码 读入 先检查是否 CTRL BREAK 若 是 则退出 否则 将键值送入 若 是 则退出 否则 将键值送入 AL 寄存器 同时将字符 显示在屏幕上 寄存器 同时将字符 显示在屏幕上 例 按例 按 A 键 则键 则 41H A ASCII码 送入码 送入AL 寄存器 屏幕显示字符 寄存器 屏幕显示字符 A 2 控制台输入但无显示 控制台输入但无显示 8号调用 号调用 与与1 号调用相似 只是不在屏幕上显示输入的字符 号调用相似 只是不在屏幕上显示输入的字符 3 打印输出 打印输出 5号调用 号调用 将将 DL 中的字符输出到打印机上 中的字符输出到打印机上 MOV DL C MOV AH 5 INT 21H 将字符将字符 C 输出到打印机上输出到打印机上 4 直接控制台输入 直接控制台输入 输出 输出 6号调用 号调用 6 号调用可以从标准输入设备输入字符 也可以向屏 幕上输出字符 并且不检查 号调用可以从标准输入设备输入字符 也可以向屏 幕上输出字符 并且不检查 CTRL BREAK 如如 DL FFH 表示从键盘输入 表示从键盘输入 ZF 0 AL 中为键入的字符值 中为键入的字符值 ZF 1 AL 中不是键入的字符 即尚无键按下 中不是键入的字符 即尚无键按下 从键盘输入的程序为从键盘输入的程序为 MOV DL 0FFH MOV AH 6 INT 21H 将字符将字符 输出的程序为输出的程序为 如如 DL FFH 表示向屏幕输出 表示向屏幕输出 DL 中为输出字 符的 中为输出字 符的 ASCII 码值 码值 MOV DL 24H MOV AH 6 INT 21H 的的ASCII 码码 5 直接控制台输入但不显示 直接控制台输入但不显示 7号调用 号调用 与与 6 号调用相似 等待从标准输入设备输入字符 然后 将其送入 号调用相似 等待从标准输入设备输入字符 然后 将其送入 AL 但对字符不做检查 但对字符不做检查 6 输出字符串 输出字符串 9号调用 号调用 调用时 要求调用时 要求DS DX必须指向内存中一个以必须指向内存中一个以 为 结束标志的字符串 字符串中每一个字符 为 结束标志的字符串 字符串中每一个字符 除外 都输出显示或打印 除外 都输出显示或打印 DATASEGMENT BUFDB HOW Are You DATAENDS CODESEGMENT MOV AX DATA MOV DS AX MOV DX OFFSET BUF MOV AH 9 INT 21H CODEENDS 执行结果执行结果 屏幕显示屏幕显示 HOW Are You 在数据段中定 义待显示字符 串 在数据段中定 义待显示字符 串 以以 结束结束 字符串首偏移 地址送入 字符串首偏移 地址送入 DX 9号调用号调用 字符串段地 址送入 字符串段地 址送入 DS 7 字符串输入 字符串输入 0A 号调用 号调用 从键盘接收字符串到内存输入缓冲区 要事先定义一个输 入缓冲区 其第一个字节指出缓冲区能容纳的字符个数 不能为 从键盘接收字符串到内存输入缓冲区 要事先定义一个输 入缓冲区 其第一个字节指出缓冲区能容纳的字符个数 不能为 0 第二个字节保留用于填写实际输入的字符个 数 从第三个字节开始存入从键盘上接收的字符 第二个字节保留用于填写实际输入的字符个 数 从第三个字节开始存入从键盘上接收的字符 如实际输入的字符数少于定义的字节数 缓冲区内其余 字节填零 如多于定义的字节数 则多余的字符丢掉并响 铃 如实际输入的字符数少于定义的字节数 缓冲区内其余 字节填零 如多于定义的字节数 则多余的字符丢掉并响 铃 调用时 要求调用时 要求 DS DX 指向输入缓冲区 指向输入缓冲区 例 例 DATASEGMENT BUFDB 50 DB DB 50 DUP DATAENDS CODE SEGMENT MOV AX DATA MOV DS AX MOV DX OFFSET BUF MOV AH 10 INT 21H CODEENDS 缓冲区长度 缓冲区长度50字节 保留 字节 保留 1 字节用于填入实际输入字符个数字节用于填入实际输入字符个数 字符串首偏移 地址送入 字符串首偏移 地址送入 DX 10号调用 等待字符串输入 号调用 等待字符串输入 字符串段地 址送入 字符串段地 址送入 DS 第四节 汇编语言程序设计的基本方法第四节 汇编语言程序设计的基本方法 一 汇编语言程序设计的基本方法一 汇编语言程序设计的基本方法 1 从实际问题抽象出数学模型 从实际问题抽象出数学模型 2 确定算法 确定算法 3 画出流程图 画出流程图 4 分配内存工作单元和寄存器 分配内存工作单元和寄存器 5 编程序 编程序 6 调试修改 调试修改 二 顺序结构程序设计二 顺序结构程序设计 例 在内存数据区例 在内存数据区2100H单元存有单元存有2位组合位组合BCD码 将其变成码 将其变成 分离分离BCD码 低位存于码 低位存于2100H单元 高位存于单元 高位存于2101H单元 单元 DATA SEGMENT ORG 2100H ZBCD DB 56H FBCD DB DATA ENDS CODE SEGMENT ASSUME CS CODE DS DATA MAIN PROC FAR START MOV AX DATA MOV DS AX LEA BX ZBCD MOV AL BX AND ZBCD 0FH MOV CL 4 SHR AL CL MOV BX 1 AL MOV AH 4CH INT 21H MAIN ENDP CODE SEGMENT END START 三 分支结构程序设计三 分支结构程序设计 条件 S0 No Yes 条件 S0 No Yes S1 条件1 S0 Yes No S1 条件2 Yes No 条件n Sn No 例 将键盘输入的一个小写字母用大写字母形式在屏幕上例 将键盘输入的一个小写字母用大写字母形式在屏幕上 显示出来 显示出来 CODE SEGMENT ASSUME CS CODE MAIN PROC FAR START PUSH DS MOV AX 0 PUSH AX MOV AH 1 INT 21H CMP AL a JB OVERFLOW CMP AL z JA OVERFLOW SUB AL 20H MOV DL AL MOV AH 06H INT 21H OVERFLOW RET MAIN ENDP END START 四 循环结构程序设计四 循环结构程序设计 初始化 循环体 循环计数 计数到 Yes No LOOP型循环型循环 初始化初始化 循环条件 循环条件 循环体循环体 Y N While型循环型循环 初始化 循环体 循环条件 Yes No UNTIL型循环型循环 LOOP型循环适用于循环次数型循环适用于循环次数 已知的情况 已知的情况 WHILE和和UNTIL型循环由循环型循环由循环 过程中变化的状态来确定是否过程中变化的状态来确定是否 满足继续循环的条件满足继续循环的条件 例 在一串给定个数的带符号字数据中寻找最大值并存地址例 在一串给定个数的带符号字数据中寻找最大值并存地址 DATA SEGMENT BUF DW 12H 253AH LEN EQU BUF MAX DW MAXADDR DW DATA ENDS CODE SEGMENT ASSUME CS CODE DS DATA MAIN PROC FAR START MOV AX DATA MOV DS AX LEA BX BUF MOV CX LEN SHR CX 1 MOV AX BX INC BX INC BX DEC CX AGAIN CMP AX BX JGE NEXT MOV AX BX MOV SI BX NEXT INC BX INC BX LOOP AGAIN MOV MAX AX MOV MAXADDR SI MOV AH 4CH INT 21H MAIN ENDP CODE ENDS END START 例 内存单元中一组带符号字节数据 编程统计其中正数 例 内存单元中一组带符号字节数据 编程统计其中正数 负数和零的个数 并存放在数据段负数和零的个数 并存放在数据段1000H开始的单元中 开始的单元中 DATA SEGMENT BUF DB COUNT EQU BUF ORG 1000H POSINUM DB NEGNUM DB ZERONUM DB DATA ENDS CODE SEGMENT ASSUME DS DATA CS CODE MAIN PROC FAR START PUSH DS MOV AX 0 PUSH AX MOV AX DATA MOV DS AX MOV BX OFFSET BUF MOV CX COUNT MOV AH 0 MOV DX 0 AGAIN MOV AL BX AND AL AL JZ ZERO JS NEGTIVE INC AH JMP NEXT NEGTIVE INC DL JMP NEXT ZERO INC DH NEXT INC BX LOOP AGAIN MOV POSINUM AH MOV NEGNUM DL MOV ZERONUM DH RET MAIN ENDP CODE ENDS END START 小结 小结 给出指令 写结果给出指令 写结果 包括对标志位的影响包括对标志位的影响 根据要求 写指令或程序段根据要求 写指令或程序段 读程 根据程序写出运行结果读程 根据程序写出运行结果 编程编程

展开阅读全文

用汇编语言程序设计实现c=a b,汇编语言程序设计1.pdf相关推荐

  1. 计算机组成原理汇编语言设计实验,《计算机组成原理汇编语言程序设计》实验指导书.doc...

    <计算机组成原理汇编语言程序设计>实验指导书,汇编语言实验指导书,微机原理与汇编语言,微机原理及汇编语言,汇编转c语言原理,汇编语言原理,汇编语言和编译原理,汇编语言编译原理,计算机原理与 ...

  2. 80c51汇编语言程序设计,章4 80C51的汇编语言程序设计

    章4   80C51的汇编语言程序设计 1.80C51单片机汇编语言有何特点? 答: 汇编语言结构紧凑.灵活,汇编成的目标程序效率高,具有占存储空间少.运行速度快.实时性强等优点.它是面向机器的语言, ...

  3. 16位汇编语言学习笔记(2)—— 汇编程序设计

    文章目录 4. 顺序程序设计 4.1 十进制的算数运算 4.2 输入输出功能调用 4.3 综合案例 5. 分支程序设计 5.1 转移指令 5.1.1 条件转移指令 单标志条件转移指令 无符号数专用条件 ...

  4. 汇编语言与计算机系统组成课后答案,汇编语言与计算机系统组成

    前言 第1篇 计算机系统组成基础 第1章 计算机系统概论 1.1 计算机的基本概念 1.1.1 存储程序的工作方式 1.1.2 信息的数字化表示 1.1.3 计算机体系结构.组成与实现 1.2 计算机 ...

  5. 汇编语言 (第2版) 王爽 中文高清PDF版下载

    汇编语言 (第2版) 王爽 中文高清PDF版下载 转载于:https://www.cnblogs.com/gavinhughhu/archive/2009/12/10/1620783.html

  6. 程序设计方法与技术——C语言 程序设计概述

    C语言的基础知识,你知道吗? 目录 一.程序是什么? 二.程序设计语言是什么? 三.C语言程序能解决什么问题? 1.C语言的前世今生 2.C程序的实现过程 四.一个C语言程序的基本结构 1.案例引入 ...

  7. C语言程序设计实现调制解调,C语言程序设计课件.ppt

    C语言程序设计课件.ppt 第3章 数 据 运 算3,内容提要,本章主要介绍C语言中的各种表达式的构造方法及其求值规则. 通过本章学习,应掌握数值运算.赋值运算.逗号运算.关系运算.逻辑运算及简单的位 ...

  8. c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第1章 程序设计概述.pdf...

    C语言程序设计 第1章 程序设计概述 C语言程序设计教程 第2版 中国铁道出版社 张磊 编著 C语言程序设计(第2版)张磊编著中国铁道出版社 第1章 程序设计概述 1.1 程序设计语言 1.2 算 ...

  9. 在职高学C语言程序设计,中职学校C语言程序设计教学方法.doc

    中职学校C语言程序设计教学方法 中职学校C语言程序设计的教学方法 摘 要:计算机专业中,C语言是一门基础的程序设计课,但学习<C语言程序设计>相对职高学生来说难度较大,但它却是很实用的一门 ...

最新文章

  1. SpringMVC+MyBatis+Redis开启二级缓存配置
  2. Javascript获取Html界面元素的几种方法
  3. 各类排序算法总结(作者:__Boost)
  4. php+ok,php fscokopen实现数据异步调用代码
  5. c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数
  6. Struts与Servlet的冲突
  7. Timus 1079. Maximum
  8. BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)
  9. python---图表的使用
  10. Java数据结构和算法 - 堆
  11. java 函数委托_Java反射实现.NET委托
  12. kNN算法__手写识别——基于Python和NumPy函数库
  13. C# 大华相机图像采集
  14. Unity3d 周分享(8期 2018.12.16)
  15. python正则表达式代码_python正则表达式实例代码
  16. 词典GoldenDict
  17. C++——计算x的n次幂
  18. 【时间之外】浏览器分屏使用技巧
  19. ★Oracle imp/impdp 导入dmp文件到数据库
  20. 一个表字段做为表名_在冬天,安心做一个简单知足的人 |为你读诗

热门文章

  1. Centos7 安装 Nginx及启动命令
  2. Java编程规范,代码验收标准
  3. 浏览器兼容性问题2(持续更新中)
  4. 蚪侠镜像站群-V25版[泛域名+泛目录+泛内页]-1对1镜像-泛镜像-[代码+汉字]干扰-字体繁简切换-蜘蛛欺骗-主动推送-全局锚文本锁定-秒仿[PC+移动]端站点
  5. B站(BiliBili)一面面经(服务端开发工程师,主站技术中心)
  6. 新垣结衣自拍照_仅使用代码创建自拍照
  7. 破解安卓图案锁屏密码
  8. 现在最暴利的行业是什么?
  9. 《电动汽车锂电池荷电状态估计与续航里程预测研究》论文阅读笔记
  10. 期货开户关于基本面量化