汇编基础知识练习题

文章目录

1、进制的定义

进制也就是进位计数制,是人为定义的带进位的计数方法。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。

  • 十进制的定义:由十个符号组成,分别是0 1 2 3 4 5 6 7 8 9 逢十进一。
  • 九进制的定义:由九个符号组成,分别是0 1 2 3 4 5 6 7 8 逢九进一。
  • 十六进制的定义:由十六个符号组成,分别是0 1 2 3 4 5 6 7 8 9 A B C D E F 逢十六进一。
  • 人为定义十进制:由十个符号组成,分别是9 1 5 2 4 7 6 3 8 0 逢十进一。

以下是修正后的二进制与十六进制对照表,以Markdown表格形式呈现:

二进制与十六进制对照表

十六进制 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

扩展:

  1. 2+3=1成立吗?说明理由。

2、进制的运算

进制运算可通过查找相应进制的加法表、乘法表找到对应的值。


扩展:

  1. 编制7进制加法表,乘法表。

3、数据宽度

计算机中,由于受硬件的制约,数据都是有长度限制的,我们称为数据宽度。

几个重要的计量单位:

  • BYTE 字节 8BIT 1字节
  • WORD 字 16BIT 2字节
  • DWORD 双字 32BIT 4字节

  • 4位宽度表示:假设计算机只能存储4位2进制数(0 ~ F)
  • 正数:0 ~ 7
  • 负数:F ~ 8 => -1 ~ -8
  • 32位宽度表示:假设计算机只能存储32位2进制数(0 ~ FFFFFFFF)

4、逻辑运算

  • 或(or |):只要有一个为1就是1;
  • 与(and &):两个都为1才是1;
  • 异或(xor ^):不一样为1;
  • 非(not !): 1是0,0是1。

扩展:

  1. CPU是如何计算2+3=?
  2. 如果想获取某个值的第N位的值是多少?
  3. 最简单的加密算法:异或。

5、32位通用寄存器

32位通用寄存器

不同宽度的寄存器之间的关系

6、MOV指令

r 通用寄存器

m 代表内存

imm 代表立即数

r8 代表8位通用寄存器

m8 代表8位内存

imm8 代表8位立即数


MOV 目标操作数,源操作数

作用:拷贝源操作数到目标操作数

1、源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元.

2、目标操作数可以是通用寄存器、段寄存器或者内存单元.

3、操作数的宽度必须一样.

4、源操作数和目标操作数不能同时为内存单元.


1、MOV r/m8,r8

2、MOV r/m16,r16

3、MOV r/m32,r32

4、MOV r8,r/m8

5、MOV r16,r/m16

6、MOV r32,r/m32

7、MOV r8, imm8

8、MOV r16, imm16

9、MOV r32, imm32


扩展:

  1. ADD指令
  2. SUB指令
  3. AND指令
  4. OR指令
  5. XOR指令
  6. NOT指令

7、寻址方式

1、寻址公式一:[立即数]

MOV EAX,DWORD PTR DS:[0x13FFC4]

2、寻址公式二:[reg] reg代表寄存器 可以是8个通用寄存器中的任意一个

MOV ECX,0x13FFD0

MOV EAX,DWORD PTR DS:[ECX]

3、寻址公式三:[reg+立即数]

MOV ECX,0x13FFD0

MOV EAX,DWORD PTR DS:[ECX+4]

4、寻址公式四:[reg+reg*{1,2,4,8}]

MOV EAX,13FFC4

MOV ECX,2

MOV EDX,DWORD PTR DS:[EAX+ECX*4]

5、寻址公式五:[reg+reg*{1,2,4,8}+立即数]

MOV EAX,13FFC4

MOV ECX,2

MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]

8、堆栈(按一定规则使用内存)

压入数据:相当于往[ESP-4]地址所指的内存写入数据,然后ESP - 4。

PUSH指令

1、PUSH r32

2、PUSH r16

3、PUSH m16

4、PUSH m32

5、PUSH imm8/imm16/imm32

弹出数据:相当于从[ESP]地址所指的内存读取数据,然后ESP+4;

POP指令

1、POP r32

2、POP r16

3、POP m16

4、POP m32

PUSHAD指令

POPAD指令

9、EFLAGS寄存器

EFLAGS寄存器

1、进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

MOV AL,0xFE

ADD AL,2

2、奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中"1"的个数的奇偶性。

如果"1"的个数为偶数,则PF的值为1,否则其值为0。

MOV AL,3

ADD AL,3

ADD AL,2

3、辅助进位标志AF(Auxiliary Carry Flag):

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;

(2)、在字节操作时,发生低4位向高4位进位或借位时。


MOV EAX,0x55EEFFFF

ADD EAX,2


MOV AX,5EFE

ADD AX,2


MOV AL,4E

ADD AL,2

4、零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。

如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

XOR EAX,EAX

MOV EAX,2

SUB EAX,2

5、符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

MOV AL,7F

ADD AL,2

6、溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

最高位进位与溢出的区别:

进位标志表示无符号数运算结果是否超出范围。

溢出标志表示有符号数运算结果是否超出范围。

溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:

正 + 正 = 正 如果结果是负数,则说明有溢出

负 + 负 = 负 如果结果是正数,则说明有溢出

正 + 负 永远都不会有溢出.

10、与标志寄存器相关的指令

1、ADC指令:带进位加法

格式:ADC R/M,R/M/IMM 两边不能同时为内存 宽度要一样

ADC AL,CL

ADC BYTE PTR DS:[12FFC4],2

ADC BYTE PTR DS:[12FFC4],AL

2、SBB指令:带借位减法

格式:SBB R/M,R/M 两边不能同时为内存 宽度要一样

3、XCHG指令:交换数据

格式:XCHG R/M,R/M/IMM 两边不能同时为内存 宽度要一样

4、MOVS指令:移动数据 内存-内存

标志寄存器中D位的值,影响移动数据的方向:

BYTE/WORD/DWORD

MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSB

MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSW

MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSD

5、STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元

STOS BYTE PTR ES:[EDI] 简写为STOSB

STOS WORD PTR ES:[EDI] 简写为STOSW

STOS DWORD PTR ES:[EDI] 简写为STOSD

6、REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令

MOV ECX,10

REP MOVSD

REP STOSD

11、JMP指令

  • MOV EIP,寄存器/立即数 简写为 JMP 寄存器/立即数
  • CALL指令:
    PUSH 地址B
    MOV EIP,地址A/寄存器 简写为:CALL 地址A/寄存器
  • RET指令:相当于 pop eip
    LEA ESP , [ESP+4]
    MOV EIP,[ESP-4] 简写为:RET

12、比较指令

  • CMP指令:

    指令格式:CMP R/M,R/M/IMM

    该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。

    只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。

  • TEST指令:

    指令格式:TEST R/M,R/M/IMM

    该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位.

    与的操作表项如下:

    1 and 1 = 1

    1 and 0 = 0

    0 and 1 = 0

    0 and 0 = 0

    常见用法:用这个指令,可以确定某寄存器是否等于0。

    TEST EAX,EAX

    但是如果EAX的二进制某些位为1的话,那么运算的结果就不为零。

13、JCC

序号 指令 描述 影响标志位
1 JE, JZ 结果为零则跳转(相等时跳转) ZF=1
2 JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=0
3 JS 结果为负则跳转 SF=1
4 JNS 结果为非负则跳转 SF=0
5 JP, JPE 结果中1的个数为偶数则跳转 PF=1
6 JNP, JPO 结果中1的个数为偶数则跳转 PF=0
7 JO 结果溢出了则跳转 OF=1
8 JNO 结果没有溢出则跳转 OF=0
9 JB, JNAE 小于则跳转 (无符号数) CF=1
10 JNB, JAE 大于等于则跳转 (无符号数) CF=0
11 JBE, JNA 小于等于则跳转 (无符号数) CF=1 or ZF=1
12 JNBE, JA 大于则跳转(无符号数) CF=0 and ZF=0
13 JL, JNGE 小于则跳转 (有符号数) SF≠ OF
14 JNL, JGE 大于等于则跳转 (有符号数) SF=OF
15 JLE, JNG 小于等于则跳转 (有符号数) ZF=1 or SF≠ OF
16 JNLE, JG 大于则跳转(有符号数) ZF=0 and SF=OF

14、堆栈图

相关推荐
leluckys3 天前
swift- Swift中常见的面试题
开发语言·汇编·swift
bcbobo21cn3 天前
学习DOS汇编显示系统日期时间程序
汇编·dos中断21h·2ah功能·2ch功能
职豚求职小程序4 天前
东软集团题库笔试测评系统练习笔试2026新版
大数据·汇编·人工智能
我在人间贩卖青春19 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春19 天前
汇编之伪操作
汇编·伪操作
济61720 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka20 天前
汇编TEST指令
汇编
我在人间贩卖青春20 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春20 天前
汇编和C编程相互调用
汇编·混合编程