欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

信息安全之汇编语言学习(记录学习持续更新。。。)

程序员文章站 2022-03-13 10:37:05
...

汇编语言的硬指令和伪指令
硬指令:
使CPU产生动作,并在程序执行时才处理的语句
伪指令:
不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等
注意:伪指令与具体的处理器类型无关,但与汇编程序的版本有关

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

MOV CX,0	;传送指令,具有2个操作数
DELAY:	NOP
	;空操作指令,没有操作数,带有标号
	LOOP DELAY
	;循环指令,标号DELAY说明转移位置
BUFFER	DB 1,2,3,4,5,6,7
	;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为17,BUFFER表示首地址

标号

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

保留字

保留字(Reserved Word)是汇编程序已经利用的标识符,主要有:
硬指令助记符——例如:MOV、ADD
伪指令助记符——例如:DB、EQU
操作符——例如:OFFSET、PTR
寄存器名——例如:AX、CS
预定义符号——例如:@data

助记符

硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令
伪指令助记符将在本章和下章学习
前一章引入的定义字节数据和字符串的DB就是伪指令

操作数与参数

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

注释

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

分隔符

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

汇编程序的程序格式

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

汇编语言程序

源程序分别用两种格式书写
第一种格式从MASM 5.0开始支持
简化段定义格式
第二种格式MASM 5.0以前就具有
完整段定义格式信息安全之汇编语言学习(记录学习持续更新。。。)lt301a.asm(文件名)
.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 ;汇编结束

简化段定义格式 MASM 6.x支持
;SampleA.ASM
.model small
.stack
.data

… ;在数据段定义数据
.code
.startup

… ;在代码段填入指令序列
.exit 0
… ;子程序代码
end
简化段定义格式 MASM 5.x支持
;SampleC.ASM
.model small
.stack
.data

… ;在数据段定义数据
.code
start:mov ax,@data
mov ds,ax

… ;在代码段填入指令序列
mov ax,4c00h
int 21h

… ;子程序代码
end start
例子:
;lt301b.asm(文件名)
stack segment stack ;定义堆栈段
dw 512 dup(?)

;堆栈段有512字(1024字节)空间
stack ends;堆栈段结束
data segment;定义数据段
string db ’Hello, Everybody !’,0dh,0ah,’$’
data ends

code segment ’code’;定义代码段
assume cs:code,ds:data,ss:stack
start: mov ax,data
;建立DS段地址
mov ds,ax
mov dx,offset string
mov ah,9
int 21h
mov ax,4c00h

int 21h;利用功能调用返回DOS
code ends;代码段结束
end start
;汇编结束,同时指明程序起始点
简化段定义格式 MASM 5.x支持
;SampleB.ASM
stack segment stack
dw 512 dup(?)
stack ends
data segment

… ;在数据段定义数据
data ends
code segment ’code’
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax

… ;在代码段填入指令序列
mov ax,4c00h
int 21h

… ;子程序代码
code ends
end start

汇编语言程序开发过程

信息安全之汇编语言学习(记录学习持续更新。。。)

相关标签: 信息安全学习