自己整理的一些汇编题基本上都是我自己提出来的然后自己找的答案其中有我自己的理解,不能保证答案全部正确如果发现错误欢迎大家指正我的QQ:1024275440
1.写出4个传送指令:
2.写出8个转移指令:
3.写出7个运算指令:
4.写出1个处理机控制指令:
5.EFLAGS寄存器包括的标志位有那些他们的功能是什么:
6.大小端模式的区别是什么:
7.一串二进制第一位为1则是否为正数:
8.请写出ADC指令的语义:
9.请写出SBB指令的语义:
10.有符号数和无符号数的区别是什么:
11.无符号5的补码是多少:
12.shr和shl指令的功能是什么:
13.堆和栈的区别是什么:
14.or和and的功能分别是什么:
15.Mod指令的作用是什么:
16.Mov eax,0x23H,请问立即数23H存储在什么段中:
17.Test指令影响的标志位有哪些他的作用是什么:
18.什么是实时模式:
19.什么是保护模式:
20.实时模式和保护模式的区别是什么:
21.当x86 cpu power on启动时以什么模式工作为什么要这样做:
22.movsx和movzx的区别是什么:
23.Loop指令的作用是什么:
24.repnz scasb指令的作用是什么:
25.repz cmpsb指令的作用是什么
26.repnz scasb和repz cmpsb指令的区别是什么:
27.call函数有传入一个参数push ebp mov ebp,esp后esp,esp+0x4,esp+0x8分别代表:
28.只有一个传入参数Call函数执行pushad mov ebp,esp后esp+0x20,esp+0x24位置分 别代表什么:
29.AL/AX/EAX,如何进行大小表达转换为16进制分别多少位
30.lea指令的作用是什么:
31.请用汇编写出一个循环函数
32._declspec(naked)该声明的作用是什么:
33.Rep/repe/repne/repnz/repe/repz终止条件是什么:
34.Rep stosb指令的作用是什么:
35.Rep movsb指令的作用是什么:
36._stdcall/_cdecl/fastcall上述三种调用约定的区别是什么,在那些场景能够使用他们:
37.div指令余数在那个寄存器当中,mul指令乘积在那个寄存器当中:
38.在x86处理器中ES/CS/SS/DS段寄存器的功能分别什么:
39.请写出EAX/EBX/ECX/EDX/ESP/EBP/ESI/EDI/EIP的主要用途:
40.FLD、FST、FSTP指令的作用是什么:
41.DWORD和QWORD的区别是什么:
42.Call $+5代表什么操作:
43.pushad入栈了多大的空间:
44.32位标志寄存器增加了那些标志位:
45. Inc和Dec指令的作用是什么:
46.现代计算机体系结构(包括X86)在内部实现上遵循了什么结构
47.INT3的功能是什么:
48.INT2D的功能是什么:
49.Icebp指令的功能是什么:
50.如何在微软系统中用汇编找到线程环境块和进程环境块
51.DR0~DR3调试地址寄存器的作用是什么:
答案在下面:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
答案
1.mov/push/pop/lea
2.Jmp/call/jnz/jz/jb/jnb/ja/jna
3.Sub/add/div/mul/cmp/adc/sbb
4.NOP
5.
ZF:零标志位、CF:进位标志位、DF:方向标志位、OF:溢出标志位
AF:辅助标志位、TF:追踪标志位、IF:中断允许标志位、SF:符号标志位、PF:奇偶标志位
6.大端是数据的高位存储在内存的低位,数据的低位储存在内存的高位
小端是数据的高位存储在内存的高位,数据的低位储存在内存的低位
7.如果当做有符号数据来看的话他是负数不是整数
8.Adc是带进位加法指令,语义:操作数1+操作数2+进位标志CF->操作数1、就是将CF标志位的值与操作数2相加给操作数1
9.sbb是带借位减法指令,语义操作数1=操作对象1-操作对象2-CF
10.有符号数就是最高位表示符号(正或负)其余为表示大小,无符号数则所有位都用于表示数的大小
11.11111011,补码等于原码全部相反+1
12.Shl左移指令shr右移指令,移动几位便是2的几次方,shl eax,1 则eax值2,如果值超出空间大小则CF标志位置位
13.栈是由局部变量和函数参数等组成他是由系统控制并且他是先进后出的,堆是由程序员创建与释放比如使用malloc函数动态开辟了一段内存那么这段内存就是堆。
14.And是逻辑与指令,相同位置值相同则为1否则为0,or逻辑或指令相同位置值不同则为1否则为0
15.MOD指令返回除法的余数
16.代码段中,因为0x23是立即数。
17.Test指令是执行逻辑与操作但是不保存结果只改变标志位,影响的标志位C,O,P,Z,S
18.实时模式是工作在8086和8080CPU上的方式,实时模式最大寻址1M,8086和8080cpu是16位CPU他们使用段寄存器16+偏移地址=物理地址的方式寻址,地址总线为20位,实时模式下所有的段都是可以读写和执行的
19.保护模式与实时模式寻址方式不同他是通过段选择符+偏移地址=线性地址,在不启用分页管理的情况下,线性地址就是最终的物理地址,启动分页机制下物理内存被分成相同固定大小的页面,2^12=4KB,每个页目录包含1024个页表,每个页表包含4个字节一个页目录等于4MB大,分段发挥了对代码和数据结构和程序的保护能力,每个程序都有自己的段表述符表和自己的段,段可以完全属于程序私有也可以和其他程序之间共享,分页机制用于解决程序过多或内存碎片过多导致内存中找不到合适的大小区域。
20.实时模式和保护模式的两个差别是一个是提供了段保护机制,二是可访问内存变大
21.以实时模式运行主要目的是为了向下兼容在操作系统运行后第一件事情就是从实时模式转换为保护模式这由操作系统完成
22.MOVSX带符号拓展传送0127或00x7F均为正数因为第一位为0大于7F为负数因为第一位为1,movsx为带符号传送比如0x50的二进制位 01010000第一位为0因此是正数
Movsx eax,0x50 则是0x00000050,如果是0x80二进制100000000第一位为1因此eax为
0xFFFFFF80,movzx是无符号传送忽略第一位符号位置因此0x80为0x00000080
23.LOOP指令是循环指令,循环次数由计数寄存器ECX指定,是否继续循环在循环体至少执行一次后,LOOP指令执行时自动将ECX的值减去1如果ECX=0则结束循环否则重复执行循环体
24.Repnz scasb指令的作用是循环比较字符,edi存储比较的地址eax存储要比较的字符,
如果计数寄存器不为0且ZF=0是则重复比较直到ZF=1或者ECX=0则停止比较,也可以通过比较00(字符结束标识符)来判断字符的长度,根据DF标志位来决定方向DF为0则edi+1,
DF为1则edi-1
25.repz cmpsb指令用于字符串的比较edi为字符串1的地址,esi为字符串二的地址根据DF标志位来决定edi和esi是+1还是-1,循环次数有计数寄存器ecx控制当ZF!=0&&ecx!=0重复循环,当出现不匹配是ZF置位repz cmpsb指令结束循环
26.Repnz scasb指令主要用于比较单个字符在整个字符串的位置,Repz cmpsb指令主要用于比较字符串是否相等
27.Esp=push ebp的地址 esp+0x4=弹栈的eip地址,esp+0x8是右边参数的第一个参数
28.Esp+0x20是eip弹栈的值,esp+0x24是从右传入的第一个参数
29.al=byte,ax=word,eax=dword,al=0xFF,ax=0xFFFF,eax=0xFFFFFFFF
30.Lea指令是取偏移的地址到操作源,比如:lea eax,[esp+0xC],lea eax,[eax+0xC]
31.
__asm {
push ebp
mov ecx, dword ptr ds : [esp + 0x8]
messagebox :
push 0x0;
push 0x0;
push 0x0;
push 0x0;
call MessageBoxW
cmp ecx,0x0
mov ecx,dword ptr ds:[esp+0x8]
dec ecx //自减
mov dword ptr ds:[esp+0x8],ecx
jnz messagebox
pop ebp
ret
}
32._declspec(naked)声明是防止编译器自行添加汇编指令信息
33.rep循环中止条件ECX=0 repe、repz 循环中止条件 ECX=0 or ZF=0 repnz/repne循环中止条件ECX=0 or ZF=1
34. Rep stob指令的作用是用一个值对缓冲区进行初始化 al是初始化的值 edi缓冲区地址 ecx缓冲区大小,一般会在xor eax,eax 对eax清空后对edi指向的缓冲区地址进行初始化
35.rep movsb指令的作用是将一段数据串复制到缓冲区当中,ecx=复制长度,edi=缓冲区地址,esi=源缓冲区地址
36.stdcall调用约定从右到左依次入栈由被调用者自身弹栈使用场景winApi默认弹栈方式,cdecl调用约定从右到左依次入栈由调用者弹栈也可以成为手动弹栈使用场景C/C++默认弹栈方式,fastcall是一种快速调用约定前两个参数用ecx和edx来传递其余参数,还是由右到左依次入栈由被调用这自身弹栈使用的场景对性能要求极高。
37.DIV指令余数存放在EDX当中,结果存放在EAX当中,MUL指令乘积在EAX中结果存放在EAX中
38.
CS代码段寄存器:
存放当前正在运行代码所在段的寄存器,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供
DS数据段寄存器:
指出当前程序使用的数据段的最低地址,即存放数据段的段基地址
SS堆栈寄存器:
指出当前堆栈底部地址,即存放堆栈段的的寄存器
ES附加段寄存器
指出当前程序使用附加数据段的段地址,
该段是串操作指令中的串所在的段
39.
EAX累加器 用途:算数运算、存储中间结果、函数返回值
EBX 基地址存储器 用途:基地址指针
ECX 计数器 用途:循环计数、移位操作计数、重复操作计数
EDX 数据寄存器 用途:乘除运算、存储中间结果
ESI 源变址寄存器 用途:存储指针、串指令的源操作数指针
EDI 源目标变地寄存器用途:存储指针、串指令的目的操作数指针
EBP 基地址指针 用途:存储指针、栈堆的栈指针
ESP 栈顶指针 用途:栈堆的栈顶指针
EIP 指令偏移寄存器 用途:根据CS寄存器+EIP偏移=正在运行的指令地址
40.
FLD指令
类似于push指令将浮点数据压入协处理器的堆栈中。
FST指令
类似于pop指令将协处理堆栈的栈顶数据传送到目标操作计数中
FSTP指令:
与FST指令类似不同的是不进行弹栈操作
汇编浮点运算指令集文章:
:https://www.cnblogs.com/mokliu/archive/2010/01/20/2138908.html
41.
8bit=1byte 八个比特=一个字节 0xFF
2byte=1word 二个字节称为一个字 0xFFFF
2word=1dword 二个字等于一个双字 0xFFFFFFFF
2dword=1qword 二个双字等于一个四字0xFFFFFFFFFFFFFFFF
42.表示当前指令所在的地址偏移,可以把call$+5的地址看做A含义就是call A+5,call的指令长度一般为5个字节可以解读成call指令的下一条指令为call的地址
43.从ESP开始算总共开辟0x1C的栈空间
44.
I/O特权标志位
I/O特权标志位用两位二进制位来表示,也称为I/O特权字段,该字段指定了要求执行I/O指令的特权级,如果当前特权级别在数值上小于等于IOPL的值,那么该I/O指令可执行否则将发生一个保护异常
嵌套任务标志NT:(Nested Task)
当NT=0,用堆栈保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作
当NT=1,通过任务转换实现中断返回
重启动标志RF
重启动标志位RF用来控制是否接受调试故障。规定:RF=0时,表示接受调试故障,否则拒绝,在成功执行完一条指令后,处理机把RF置为0,当接受一个非调试时,处理机就把它置为1
虚拟8086标志VM
如果该标志的值为1,则表示处理机处于虚拟8086的方式下的工作状态,否则处理机处于一般保护方式下的工作状态
45.INC指令自增、DEC指令自减
46.冯诺依曼结构
47.INT3 字节码为0XCC用于软件断点
48.INT2D 功能类似于INT3但是INT 2D使内核态断点的方式
49.Icebp指令被单步执行是会发生异常,主要用于反调试技术
50.Fs线程环境段fs:[0x30]进程环境块
51.DR0~DR3用于设置硬件断点