assembly_notes

伪指令

语句的四个部分要用分隔符分开

  1. 标号后的冒号:
  2. 注释前的分号:
  3. 操作数与参数前的分号:
  4. 分隔其他部分采用的一个或多个空格或制表符

常量表达

常数是指由10进制16进制和2进制形式表达的数值
默认不加字母的是十进制数,并且16进制若以字母开头要加上前导0(与寄存器分别开来)

字符或字符串常量

用英文缩略号(类似中文单引号‘’ )或双引号括起来的单个或多个字符
如果字符串中包含单引号本身则用双引号括起来反之用单引号

masm中有‘enq’ 和=为常量定义符号名
但是‘enq’不能重复定义符号名但是=可以
及‘enq’每个符号名只能定义一次常量类似C语言const

变量定义

变量类型
image-20221104003845335

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;定义字符串
msg byte 'hello',13,10,0 ;13回车10换行0字符串结束标志
bvar1 byte 0,128,255,-128,0,+127
00000000 00 80 FF 80 00 7F ;
bvar2 byte 1,-1,38,-38,38h,-38h
00000006 01 FF 26 DA 38 C8
bvar3 byte ? ;问号表示无初值用0表示
;dum 重复 duplication
bvar4 byte 5 dup('$')
0000000D 00000005[24] ;把$重复了五次

=0000000A
minint=10 ;常量的定义
bvar5 byte minit dup(0),minit dup(minit,?) ;表示重复十次0重复十次10和0
;dup()的嵌套
byte 2 dup(2,3,2 dup(4)) ;表示2 3 4 4 2 3 4 4

16位32位变量的定义类似

数据寻址方式

立即数寻址

操作数作为机器代码的一部分跟随处理器的取址操作进入指令寄存器。

1
mov eax,33221100h   ;将33221100立即数存储在eax寄存器之中

image-20221107210922628

立即数寻址只用于源操作数

  1. 常用来给寄存器和储存单元赋值
  2. 用常量形式直接表达

寄存器寻址

指令操作数存放在处理器的寄存器之中。
寄存器寻址的目的操作数与原操作的类型要相同

存储器寻址

大部分情况之下段基地址有默认规定,无需表达

  1. 读取指令,代码段cs
  2. 堆栈操作,堆栈段ss
  3. 读写数据,数据段ds

但有的时候我们没有按照默认情况进行数据的访问则要进行显式说明(段超越)
image-20221107214503191

由图可得我们读取指令只能从cs寄存器得到不能替代,但是数据访问可以允许段超越

偏移地址的组成

32位有效地址=基址寄存器+(变址寄存器x比例)+位移量

image-20221107215217214

16位有效地址的组成

image-20221107215248551

编写32位Windows控制台环境的应用程序时,必须接受操作系统的管理不能违反其保护规则,例如一般不能 修改段寄存器的内容,进行数据寻址的地址必须在规定的数据段区域中,如果随意设置访问的逻辑地址,将可能导致非法访问。尽管汇编的语法没有错误运行时将会提示运行错误

image-20221123162448058

general data process instruction

data transfer instruction

可以将一个字节,字,doublewords从源位置移动到目的位置
image-20221123155039400

主存之间的数据不能直接移动

立即数与寄存器之间的间接寻址的储存单元没有明确的类型,IA-32指令系统要求类型一致的两个操作数之一必须有明确的类型,否则要用 ==ptr==指示