DJ13-1 汇编语言程序设计-1

目录

一、基本概念

二、汇编语言源程序的结构

三、汇编语言语句类型及格式

1. 指令性语句

2. 指示性语句

四、数据项及表达式

1. 常量

2. 标号

3. 变量

4. 表达式


一、基本概念

1. 机器语言(machine language)

是用二进制码来表示指令和数据的语言,是计算机硬件系统唯一能够直接理解和执行的语言,具有执行速度快、占用内存少等优点。但是其不直观、不易理解和记忆,因此编写、阅读和修改程序都比较麻烦。

2. 汇编语言(assembly language)

弥补了机器语言的不足,它用指令助记符、符号地址、标号和伪指令等来书写程序。由于助记符接近于自然语言,因此与机器语言相比,它在程序的编写、阅读和修改方面都比较方便、不易出错,且执行速度和机器语言程序相同。

3. 汇编语言源程序

用汇编语言编写的程序称为汇编语言源程序。

4. 汇编(assemble)

由于计算机只能辨认和执行机器语言,因此必须将汇编语言源程序翻译成能够在计算机上执行的机器语言(称为目标代码),这个翻译的过程称为汇编。

5. 汇编程序(assembler)

完成汇编过程的系统程序叫作汇编程序。

6. 宏汇编程序(MASM)

是目前使用较多的汇编程序。

汇编语言和机器语言一样,都是面向具体机器的语言。也就是说,不同种类的 CPU 具有不同的汇编语言,互相之间不能通用。(由于不同种类的 CPU 的指令系统不同

7. 高级语言(high level language)

与上述两种语言相比,高级语言的语句更接近人类语言,所以用高级语言编写的程序易读、易编。相对比较简短。它与具体的计算机无关,不受 CPU 类型的限制,通用性很强。

8. 编译程序和解释程序

用高级语言编写的源程序同样必须翻译成为机器代码计算机才能执行,完成这个翻译过程的系统软件称为编译程序或解释程序。

“汇编是从汇编语言到机器码的过程,编译是源代码 → 词法分析 → 语法分析 → 中间代码生成和优化 → 汇编代码 → 机器码的过程。有一些语言是解释执行,就转为对应虚拟机的字节码。”

汇编和编译具体指什么?有什么区别?http://xn--6iqa27ab64eu3hfpb6zdz9dht6cshj6yppv1dba9999bdtz4afa

二、汇编语言源程序的结构

结构特点:

  • 一个完整的汇编语言源程序通常由若干个逻辑段组成;
  • 每个逻辑段以 SEGMENT 语句开始,以 ENDS 语句结束;
  • 整个源程序用 END 语句结束。
段名1 SEGMENT
...
段名1 ENDS
段名2 SEGMENT
...
段名2 ENDS
...
段名n SEGMENT
...
段名n ENDS
    END

应用举例:

将数据段中两个字单元数据相加,结果存入附加段字单元中。

DSEG SEGMENT
    DATA1 DW 0F865H  ; 定义被加数:初始化变量DATA1
    DATA2 DW 360CH   ; 定义加数:初始化变量DATA2
DSEG ENDS
ESEG SEGMENT
    SUM DW 2 DUP(0)  ; 定义存放结果区,等价于SUM DW 0, 0
ESEG ENDS
SSEG SEGMENT STACK   ; 必须定义堆栈段
    DW 20H DUP(0)
SSEG ENDS
CSEG SEGMENT
    ; 说明程序中定义的各段分别用哪个段寄存器寻址
    ASSUME CS:CSEG, DS:DSEG, ES:ESEG
START:
    MOV AX, DSEG     ; 将DSEG存储的段地址送入DS,此后将由DS提供段地址
    MOV DS, AX
    MOV AX, ESEG     ; 将ESEG存储的段地址送入ES,此后将由ES提供段地址
    MOV ES, AX

    MOV AX, DATA1    ; 取被加数
    ADD AX, DATA2    ; 两数相加
    MOV SUM, AX      ; 和送附加段的SUM单元中
    HLT
CSEG ENDS
    END START        ; 源程序结束

三、汇编语言语句类型及格式

汇编语言源程序语句:指令性语句、指示性语句。

1. 指令性语句

定义是由指令系统中的指令助记符组成的语句,汇编后生成可被 CPU 执行的目标代码

格式:{标号:}  {前缀}  操作码  {操作数,操作数}  {;注释}

加花括号的是可选项,可以有,也可以没有。

  • 对于标号,例如 L1:MOV ... 中的 L1 就是一个标号;
  • 对于前缀,例如 REP、REPZ、REPNZ;
  • 对于操作数,最多为双操作数,也可以没有操作数。

2. 指示性语句

定义用于告诉汇编程序如何对源程序进行汇编,不生成可执行的目标代码。

指示性语句又称伪操作语句或伪指令。

格式:{名字}  伪指令  操作数{,操作数,... }  {;注释}

  • 对于名字,例如变量名、段名;
  • 对于伪指令,用于告诉编译器如何进行编译;
  • 对于操作数,至少要有一个,并可根据需要有多个。

四、数据项及表达式

各种形式的数据项最终还是会被还原成一个立即数。

1. 常量

(1)数字常量

  • 二进制数:以字母 B 结尾,如 01001001B 。
  • 八进制数:以字母 Q 结尾,如 631Q 。
  • 十进制数:以字母 D 结尾或不加结尾。
  • 十六进制数:以字母 H 结尾。

对于十六进制数,若以字母 A~F 开头,则在前面加一个数字 0,如 0FEH。

 

 

(2)字符串常量:用 单引号 括起来的一个或多个字符,其值为这些字符的 ASCII 码值。

汇编程序将其中的每一个字符分别翻译成对应的一个字节的 ASCII 码,如 'AB',汇编时将翻译为 41H、42H。

TMI:不像 C 或 C++ 那样自动在最后加结束标志。ASCII 是 8 位。

2. 标号

标号放在一条指令的前面,它就是该指令在内存中存放地址的符号表示,即指令地址的别名。

每个标号有三种属性:段值属性、偏移量属性、类型属性。

① 段值属性:标号所在段的段地址。

② 偏移量属性:标号所在段的段首到定义标号的地址之间的字节数,即偏移地址。

③ 类型属性:标号的类型有 NEAR 和 FAR 两种。

  • NEAR 型地址指针为 2 个字节,只能在段内引用;
  • FAR 型地址指针为 4 个字节,可以在其它段被引用。
JMP L1  ; 缺省时默认为NEAR,等价于JMP NEAR PTR L1

; 获取属性,其中OFFSET和SEG是伪指令
MOV BX,SEG L1     ; 获取 L1 的段地址
MOV BX,OFFSET L1  ; 获取 L1 的偏移地址

3. 变量

(1)变量的基本概念

变量是用来表示存放数据的存储单元。

程序中以变量名的形式来访问变量,而变量名就是 存放某数据块的存储单元的首地址

每个变量有三种属性:段值属性、偏移量属性、类型属性。

① 段值属性:变量所在段的段地址。

② 偏移量属性:变量所在段的段首到变量地址之间的字节数,即偏移地址。

③ 类型属性:BYTE(字节)、WORD(单字)、DWORD(双字)、QWORD(四字)

变量类型必须满足指令要求。

(2)变量的定义

格式:

变量名 DB 表达式1, 表达式2 ...    ; 定义1字节变量
变量名 DW 表达式1, 表达式2 ...    ; 定义2字节变量
变量名 DD 表达式1, 表达式2 ...    ; 定义4字节变量
变量名 DQ 表达式1, 表达式2 ...    ; 定义8字节变量
变量名 DT 表达式1, 表达式2 ...    ; 定义10字节变量

说明: 其中表达式1、表达式2是给存储单元赋的初值。

应用举例:

VAR_DATA SEGMENT
    DATA1 DB 12H        ; 定义1字节变量
    DATA2 DB 20H, 30H   ; 定义1字节变量
    DATA3 DW 5678H      ; 定义2字节变量
VAR_DATA ENDS

注意事项:

① 变量类型与指令的要求必须相符。

DATA2 DB 200H  ; 错误。只能赋一个字节。

MOV BX, DATA2  ; 错误。类型不匹配。若强制转换,则DATA2内容为3020H。

② 在定义变量时,变量名对应的是数据区的首地址。如果数据区中有多个数据,则在对其它数据操作时需修改地址。

NUM DB 11H, 22H, 33H
...
MOV BL, NUM      ; 将11H送入BL
MOV AL, NUM + 2  ; 将33H送入AL

4. 表达式

表达式是指令性语句操作数的常见形式,它由常数、变量、标号等通过操作运算符连接而成。

说明:汇编语言语句中的表达式不是指令,本身不能执行。在程序汇编时,汇编程序将表达式进行相应的运算,得出一个确定的值。所以在程序执行时,表达式本身已是一个有确定值的操作数。表达式仅是将求其值的计算任务交给了汇编程序来完成。

应用举例:

MOV AX, 0ADH AND 0CCH

MOV BX, OFFSET DMem1

MOV BX, 0FFFFH AND AX    ; 错误。编译期AX的内容不能确定,要执行之后才能确定。

MOV BX, 0FFFFH AND [BP]  ; 错误。编译期存储器内容也不能确定,要执行之后才能确定。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值