1 / 186

第 4 章

第 4 章. 汇编语言程序设计. 中国科学技术大学 何克东. 汇编语言是利用指令的助记符、符号地址、标号来编写的语言,它是机器语言的符号表示,是低级语言。 汇编语言是面向机器的,是和机器的硬件密切相关的。 汇编语言编写的程序效率高,节省内存,运算速度快。. 段开始. 例 4 - 1 在屏幕上显示并打印字符串. DATA SEGMENT DA1 DB ‘This is a sample program.’ DB 0DH,0AH,’$’ DATA ENDS

soren
Download Presentation

第 4 章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 4 章 汇编语言程序设计 中国科学技术大学 何克东

  2. 汇编语言是利用指令的助记符、符号地址、标号来编写的语言,它是机器语言的符号表示,是低级语言。汇编语言是利用指令的助记符、符号地址、标号来编写的语言,它是机器语言的符号表示,是低级语言。 汇编语言是面向机器的,是和机器的硬件密切相关的。 汇编语言编写的程序效率高,节省内存,运算速度快。

  3. 段开始 例4-1 在屏幕上显示并打印字符串 DATA SEGMENT DA1 DB ‘This is a sample program.’ DB 0DH,0AH,’$’ DATA ENDS STACK SEGMENT PARA SEGMENT ‘SEGMENT’ ST1 DB 100 DUP(?) STACK ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,STACK; 段寄存器赋值 MOV SS,AX 数据段 变量名 段分类名 段定位类型 段结束 堆栈段 段组合类型 过程 开始 汇编时分配段寄存器 代码段 过程 标号

  4. PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSET DA1 输出字符串 INT 21H RET MAIN ENDP CODE ENDS END START PSP首址入栈 段寄存器赋值 代码段 返回主程序 MOV AX,4C00H INT 21H 过程 结束 起始地址 模块结束

  5. 4.1 汇编语言程序格式 指令性语句 汇编语句 伪指令语句

  6. 指令和伪指令 • 指令——使CPU产生动作、并在程序执行时才处理的语句,生成目标码。 • 伪指令——不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等,不生成目标码。 MOV SP,BX 1000101111100011 DB 1,2

  7. 执行性语句——由指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: [标号:] 指令助记符 操作数,操作数 [;注释] ⑵ 说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: [名字] 伪指令助记符 参数,参数,… [;注释] 语句格式

  8. MASM LINK 目标文件 可执行文件 汇编语言源程序 编辑 执行 连接 汇编 A.ASM A.OBJ A.EXE 第一遍扫描:存储分配 汇编 第二遍扫描:代真

  9. 标号、变量与标识符 • 标号是反映指令位置(逻辑地址)的标识符,后跟一个冒号分隔。 • 变量是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号。 • 标识符一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写 • 一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字。

  10. 保留字 • 保留字是汇编程序已经利用的标识符,主要有: • 指令助记符——例如:MOV、ADD • 伪指令助记符——例如:DB、EQU • 操作符——例如:OFFSET、PTR • 寄存器名——例如:AX、CS • 预定义符号——例如:@data 汇编语言大小写不敏感

  11. 助记符 • 指令助记符是指令名称的代表符号,它指出指令的操作类型,汇编程序将其译成机器指令。 • 伪指令助记符是在对源程序汇编期间由汇编程序处理的操作,如定义数据、分配存储区、指示程序结束等。没有对应的机器指令。

  12. 操作数与参数 • 指令的操作数可以是立即数、寄存器和存储单元 • 伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔

  13. 注释 • 语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性 • 必要时,一个语句行也可以由分号开始作为阶段性注释 • 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理

  14. 分隔符 • 语句的4个组成部分要用分隔符分开 • 标号后用冒号,注释前用分号 • 操作数之间和参数之间使用逗号分隔 • 其他部分通常采用空格或制表符 • 多个空格和制表符的作用与一个相同 • 续行符 “&”

  15. 汇编语言源程序的组成原则 • 完整的汇编语言源程序由段组成 • 一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列 • 需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点 • 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内 • 通常,程序还需要一个堆栈段

  16. 程序功能 汇编语言源程序 • 源程序分别用两种格式书写 • 第一种格式MASM 5.0以前就具有 • 完整段定义格式 • 第二种格式从MASM 5.0开始支持 • 简化段定义格式 Hello, Everybody !

  17. stack segment stack ;定义堆栈段dw 512 dup(?) ;堆栈段有512字(1024字节)空间stack ends ;堆栈段结束data segment ;定义数据段string db ’Hello, Everybody !’,0dh,0ah,’$’data endscode segment ’code’;定义代码段assume cs:code,ds:data,ss:stackstart: mov ax,data ;建立DS段地址mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h ;利用功能调用返回DOScode ends ;代码段结束end start ;汇编结束,同时指明程序起始点 • 例:完整段定义格式

  18. ;.model small ;定义程序的存储模式.stack ;定义堆栈段.data ;定义数据段string db ’Hello, Everybody !’,0dh,0ah,’$’ ;在数据段定义要显示的字符串.code ;定义代码段.startup ;程序起始点,建立DS、SS mov dx,offset string ;指定字符串mov ah,9 int 21h ;利用功能调用显示信息.exit 0 ;程序结束点,返回DOS end ;汇编结束 • 例:简化段定义格式

  19. 数据项 常数 属性 段 偏置 类型 字节 字 双字 变量 数据 段 偏置 类型 标号 近 远

  20. 常数 • 常数(常量)表示一个固定的数值 • 它又分成多种形式: (1)十进制常数 (2)十六进制常数 (3)二进制常数 (4)八进制常数 (5)字符串常数 (6)符号常数

  21. 十进制常数 • 由0 ~ 9数字组成,以字母D或d结尾 • 缺省情况下,后缀D或d可以省略 • 汇编语言大小写不敏感,D和d通用 • 例如:100、255D

  22. 十六进制常数 • 由0~9、A~F组成,以字母H或h结尾 • 以字母A~F开头的十六进制数,前面要用0表达,以避免与其他符号混淆 • 汇编语言大小写不敏感, H和h 通用 • 例如:64H、0FFh、0B800H

  23. 二进制常数 • 由0或1两个数字组成,以字母B或b结尾 • 汇编语言大小写不敏感,B和b通用 • 例如:01101100B

  24. 八进制常数 • 由0 ~ 7数字组成,以字母Q或q结尾 • 汇编语言大小写不敏感,Q和 q 通用 • 例如:144Q • 各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数 MASM提供基数控制.RADIX伪指令可以改变默认进制,其格式是: .RADIX n

  25. 字符串常数 • 用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值 • 例如: 'd' “AB” 'Hello, Everybody !'

  26. 符号常数 利用一个标识符表达的一个数值 MASM提供等价机制,用于常量定义 符号定义伪指令: • 等价EQU伪指令 符号名 EQU 数值表达式 符号名 EQU <字符串> • 等号=伪指令 符号名 = 数值表达式 常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性

  27. 例:符号常数 符号定义 PORTA equ 10H PORTB = 12H DATA equ 20 符号应用(左侧的符号形式等价右边程序段) IN AL,PORTA ;IN AL,10H OUT PORTB,AL ;OUT 12H,AL MOV AX,DATA*2 ;MOV AX,20*2

  28. 变量:内存单元,其中的值在程序运行中可以修改。具有:段、偏移地址、类型(数据长度)3个属性。变量:内存单元,其中的值在程序运行中可以修改。具有:段、偏移地址、类型(数据长度)3个属性。 • 标号:可执行指令的地址的符号表示。具有:段、偏移地址、类型(近、远)3个属性。 • 标号只能在代码段,变量可以在任意一个段,但通常只在非代码段。

  29. 4.2 MASM中的表达式 表达式由运算对象及运算符组成,在汇编时由汇编程序对它运算,运算结果作为一个语句中的操作数去使用。运算对象可以是常数、变量或标号,得到的运算结果可以是一个常数字,也可以是存储器的地址,在此地址中存放了数据或指令。

  30. 一、算术运算符+、 -、 * 、 / 、MOD 、SHL、SHR • 实现加、减、乘、除、取余的算术运算 mov ax,3*4+5 ;等价于 mov ax,17 • 其中MOD也称为取模,它产生除法之后的余数,如 19 mod 7 = 5 • 加+和减-运算符还可以用于地址表达式

  31. DA EQU 300 : MOV AX,220 MOV BX,0 MOV CX,3 MOV DH,19H DA EQU 300 : MOV AX,DA -80 MOV BX,DA MOD 100 MOV CX,DA/100 MOV DH,01100100B SHR 2

  32. SHL/SHR • 格式:数值表达式 SHL/SHR 移位次数 • 功能:实现对数值的左移、右移的逻辑操作;移入低位或高位的是0 mov al,0101b SHL (2*2) mov al,01010000b

  33. 二、逻辑运算符 AND 、 OR 、 NOT 、 XOR • 实现按位相与、相或、异或、求反的逻辑运算 AND al,03h AND 45h AND al,01h 00000011 ^ 01000101 00000001

  34. MOV AL, 0 MOV AL, 0 MOV AH, 0FFH MOV CH, 0FFH MOV AL,NOT 0FFH MOV AL,8CH AND 73H MOV AH,8CH OR 73H MOV CH,8CH XOR 73H 10001100 ^ 01110011 00000000 10001100 01110011 11111111 10001100 V 01110011 11111111

  35. 三、关系运算符 EQ、NE、LT、GT、LE、GE • 用于比较和测试符号数值 • MASM用0FFFFH(补码 -1)表示条件为真 • MASM用0000H表示条件为假 mov bx,((PORT LT 5)AND 20)OR((PORT GE 5)AND 30) ;当PORT<5时,汇编结果为mov bx,20 ;否则,汇编结果为mov bx,30

  36. MOV AX, 10H GT 16 ADD BL, 6 EQ 0110B MOV CX,((PORT LT 5) AND 100) OR ((PORT GE 5)AND 200) MOV AX, 0 ADD BL, 0FFH MOV CX,100 ; PORT<5 MOV CX,200 ; PORT >=5

  37. 四、数值返回运算符 • 也称分析运算符 • 放在变量或标号前,返回运算对象的某个参数值,例如偏移地址值、段地址值、类型属性变量包含的单元数等。

  38. 偏置 类型 字节 字 双字 变量 属性 段 偏置 类型 标号 近 远

  39. OFFSET • 格式:OFFSET 变量/标号 • 功能:返回变量或标号的偏移地址值 • SEG • 格式:SEG 变量/标号 • 功能:返回变量或标号所在段的段基值

  40. data segment array db 12H,45h data ends : mov ax, seg array ;mov ax, data mov ds,ax mov bx, offset array ; lea bx, array

  41. 格式:TYPE 变量名/标号名 功能:返回名字或标号类型的一个字节量数值 对字节、字和双字变量依次返回1、2和4; 对近和远转移依次返回-1(FFH)和-2(FEH) mov ax,TYPE w_var ;汇编结果为mov ax,2 mov ax,TYPE n_jump ;汇编结果为mov ax,0ffh(near标号) TYPE

  42. LENGTH • 格式:LENGTH 变量名 • 功能:对变量中使用DUP时,返回此变量所包含的单元数即重复因子值,对其它变量则返回1。

  43. SIZE • 格式:SIZE 变量名 • 功能:返回该变量包含的总字节数 SIZE=LENGTH×TYPE

  44. v_word dw 3332h,3735h target dw 5 dup(20h) mov ax, type v_word mov ax,2 mov ax, length v_word mov ax,1 mov cx, type target mov cx,2 mov cx, length target mov cx,5 mov cx, size target mov cx,10

  45. 五、修改属性运算符 • 也称综合运算符 • 修改变量或标号的属性

  46. 格式:段前缀:变量或地址表达式 功能:表示某个变量或地址属于段前缀指定的那个段 MOV AX,ES:[BX] MOV AX,DS:[BP] 段操作符号

  47. 格式:类型名 PTR 名字/标号 功能:PTR操作符使名字或标号具有指定的类型 类型名可以是 BYTE、WORD、DWORD 或者是NEAR、FAR mov al,byte ptr w_var ;w_var是一个字变量 jmp far ptr n_label ;n_label是一个标号 使用PTR操作符,可以临时改变名字或标号的类型 PTR

  48. 格式:变量/标号 EQU THIS 类型名 功能:将右边的类型赋予左边的变量/标号,它与下一个存储单元具有相同的地址。 b_var equ THIS byte ; 按字节访问变量b_var, ;但与w_var的地址相同 w_var dw 10 dup(0) ;按字访问变量w_var f_jump equ THIS far ;用f_jump为段间转移(;(f_jump label far) n_jump: mov ax,w_var ;用n_jump为段内近转移, ;但两者指向同一条指令 LABEL伪指令的功能等同于“EQU THIS” THIS操作符

  49. 格式:SHORT 标号 功能:指定标号作为-128~+127字节范围内的短转移 jmp short n_jump SHORT

  50. v_byte equ this byte v_word dw 3332h,3735h : mov al, v_byte mov ax, v_word : mov al,byte ptr v_word;(al) 32H dec al ;(al) 31H mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H 例:

More Related