2、第二个汇编程序 && x86寄存器 && 寻址方式

本文介绍了x86汇编语言中的寄存器用法,包括通用寄存器如eax, ebx等在除法指令中的角色,以及特殊寄存器eip, eflags的功能。同时,通过一个简单的汇编程序实例,解释了如何通过.data段声明数组,并使用变址寻址来访问数组元素。最后,讨论了直接寻址、变址寻址和基址寻址等不同的寻址方式及其应用。" 14162499,1029852,理解设计模式:代理模式详解,"['设计模式', '代理模式', 'C++']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、x86寄存器

    x86的通用寄存器有 eax, ebx, ecx, edx ,edi, esi,有些指令规定只能使用其中的某个寄存器,如除法指令idivl要求被除数在 eax寄存器中,edx寄存器为0,而除数寄存器可以为任意寄存器,计算结果必须保存在 eax寄存器中,余数保存在edx寄存器中

    x86的特殊寄存器有ebp, esp, eip, eflagseip是程序计数器,相当于PC寄存器,eflags保存着计算过程中产生的标志位,ebp和esp用于维护函数调用的栈帧

 

2、第二个汇编程序

.section .data

 data_items:

     .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

 

.section .text

.globl _start

_start:

     movl $0, %edi

     movl data_items(,%edi,4), %eax

     movl %eax, %ebx

 

start_loop:

     cmpl $0, %eax

     je loop_exit

     incl %edi

     movl data_items(,%edi,4), %eax

     cmpl %ebx, %eax

     jle start_loop

 

     movl %eax, %ebx

     jmp start_loop

 

loop_exit:

     movl $1, %eax

     int $0x80    


 

程序解析:

/******************************************************************************************************************

.section .data

 data_items:

     .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

 .long指示声明一组数,每个数占32位,相当于C语言中的数组。数组开头定义了一个符号data_items,汇编器会把数组的首地址作为data_items符号所代表的地址,data_items相当于数组名,除了 .long外常用的数组名还有:

  .byte :也是声明一组数,每个数占8位

  .ascii:如 .ascii "hello world"声明11个数,取值为相应的ASCII码,这样声明的字符串末尾是没有'\0'字符的

 

movl data_items(,%edi,4), %eax

   这条指令把数组data_items的第0个元素传递给 %eax,data_items是数组的首地址,edi的值是数组的下标,4表示数组的元素占4个字节,那么数组中的第 edi个元素地址应该是 data_items + edi * 4,写在指令中就是movl data_items(,%edi,4), %eax

 

 

cmpl %ebx, %eax

     jle start_loop

将eax和ebx比较,如果 eax <= ebx则跳转

******************************************************************************************************************/

 

3、寻址方式

     直接寻址: movl ADDRESS, %eax把ADDRESS地址处的32位数传送到eax寄存器

  变址寻址: movl data_items(,%edi,4)

  基址寻址: movl 4(%eax), %ebx用于访问结构体成员,如一个结构体的基地址保存在eax寄存器中,其中一个成员在结构体内的

             偏移量是4字节,要把这个成员读上来就可以使用这条指令 

  立即数寻址: movl $12 , %eax

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值