汇编指令和寄存器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编指令和寄存器相关的知识,希望对你有一定的参考价值。

参考技术A 早期的 x86 CPU 只有 8 个寄存器( eax 、 ebx 、 ecx 、 edx 、 esi 、 edi 、 ebp 、 esp ),而且每个都有不同的用途。

x86-64 中,所有寄存器都是 64 位,相对 32 位的 x86 来说,标识符发生了变化,比如:从原来的 eax 变成了 rax 。为了向后兼容性, eax 依然可以使用,不过指向了 rax 的低 32 位。

比如在 64 位 CPU 上:

它们的对照关系如下:

通过 gdb 的 p /x $reg 命令打印寄存器的值。

mov 指令是最常见的数据传送指令,类似于高级语言中的赋值语句。

mov 指令可以实现寄存器与寄存器之间、寄存器与内存之间、寄存器与立即数、内存与立即数的数据传递。

mov 指令的用法示例如下:

push 指令和 pop 指令互为相反的操作指令。

push 指令把一个 32 位的操作数送入堆栈,该操作致使 esp 寄存器的值减 4。
esp 寄存器始终指向栈顶。堆栈的方向是由高地址向低地址进行延伸,也就是执行的 push 次数越多, esp 寄存器指向的地址越小。
在 32 位平台上,每执行一次 push 指令, esp 指向的地址都减小 4 字节。

pop 指令把 esp 指向地址(栈顶)中的值送入寄存器或内存中,然后 esp 指向的地址加 4 字节。
执行的 pop 指令越多, esp 寄存器指向的地址越大。

汇编语言实验2 用机器指令和汇编指令编程

四、实验结论

任务一:使用debug,将下面程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

1.使用r命令查看各寄存器初始值。

技术分享图片

2.使用a命令编写汇编指令。

技术分享图片

3.使用t命令单步执行。

技术分享图片

技术分享图片

技术分享图片

技术分享图片

4.分析

此实验使用栈实现了寄存器值的交换

指令 ax bx ss sp
mov ax,ffff FFFF 0000 073F 00FD
mov ds,ax FFFF 0000 073F 00FD
mov ax,2200   2200 0000 073F 00FD
mov ss,ax   2200 0000 2200 0100
mov sp,0100
mov ax,[0] C0EA 0000 2200 0100
add ax,[2] C0FC 0000 2200 0100
mov bx,[4] C0FC 30F0 2200 0100
add bx,[6] C0FC 6021 2200 0100
push ax C0FC 6021 2200 00FC
push bx C0FC 6021 2200 00FC
pop ax 6021 6021 2200 00FE
pop bx 6021 C0FC 2200 0100
push [4] 6021 C0FC 2200 00FE
push [6] 6021 C0FC 2200 00FC

  注:背景涂色的两行代码,在使用t命令单步执行时,同时进行。

6.书后习题

技术分享图片

内存单元地址:DS:[ ]

栈地址:SS:SP

 

任务二:仔细观察图3.19中的实验过程,然后分析,为什么2000:0~2000~f中的内容会发生改变?

1.使用a命令输入汇编指令;

使用e命令修改2000:0段内存单元的值,使之为0;

使用d命令查看修改后的内存单元的值。

技术分享图片

 

2.使用t命令单步执行;

使用d命令查看2000:0段内存单元的值。

技术分享图片

 

3.分析

ss:sp,意味着栈顶指针,汇编指令mov修改了ss:sp,使之变为2000:0。

当对栈进行操作时,ss:sp随着入栈出栈的操作变化,会改变这一段内存单元的值。


五、总结与体会

通过任务一,我了解到,汇编指令对ss和sp是同时进行操作的,当两条语句在相邻的上下行时,使用t命令单步执行,这两个指令会同时进行;我还进一步理解了,当使用到内存单元的地址[ ]时,默认以DS寄存器里的值作为段地址,去访问DS:[ ];我还知道了,pop ax是把栈顶元素的值,弹到ax里,不是之前的错误理解(以为把ax弹出,其实一点都讲不通)。

通过实验二,我加深了对栈顶指针SS:SP的理解,明白了在编写汇编指令时,要注意栈内存单元的选取,不能影响其他正常的操作。

 

以上是关于汇编指令和寄存器的主要内容,如果未能解决你的问题,请参考以下文章

汇编基础 汇编指令

汇编指令

[汇编]《汇编语言》第10章 CALL和RET指令

汇编语言实验2 用机器指令和汇编指令编程

汇编指令机器码说明

汇编指令