汇编语言中的寻址方式

直接寻址

movl address, %eax

把地址address加载到%eax里

直接寻址,有点像c里面给一个指针变量赋值。

索引寻址

movl string_start(, %edi, 1), %eax

该指令将 地址=(string_start的地址)+(下表 %edi里面的值) * (数组每个元素的大小) 所指向的值保存到%eax里

%edi存放的是下标,1是数组每个元素的字节数

上面索引寻址有点像c里面用下标访问字符数组,如果string_start是类似c里面的int型数组,1就要改为4

char str[] = "hello world";
char c = str[0];//c = ‘h‘

间接寻址

movl (%eax), %ebx

间接寻址方式从寄存器指定的地址加载值。间接寻址有点像c里面用*对一个地址解引用

基址寻址

movl 4(%eax), %ebx

基址寻址与间接寻址方式类似,不同之处在于它将一个常量值与寄存器中的地址相加。

立即寻址

movl $1, %eax

立即寻址用于将值(这里是1)加载到寄存器中。

时间: 2025-01-04 06:55:39

汇编语言中的寻址方式的相关文章

linux平台学x86汇编(十六):在汇编语言中调用C库函数

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 其实在汇编语言中也是可以使用C库函数的,这一节我们来看一下如何在汇编语言中调用C库函数以使得我们的程序看上去很方便地和用户交互. C库包括C程序通用的喝多函数,如printf和exit等,下面我们紧接着上一节的知识来实现一个两整数想加的计算并输出计算结果的程序. # libc.s .section .data output: .asciz "The result is %d.

硬盘中磁头寻址方式

看了好多中介绍硬盘工作原理的文章,一直有几个问题困扰着我: 1)硬盘工作时转动,非工作时不转动 2)磁头寻址的轨迹是怎么样的 下边就这两个问题来说明下 1)待机是将当前处于运行状态的数据保存在内存中,机器只对内存供电,而硬盘.屏幕和CPU等部件则停止供电.由于数据存储在速度快的内存中,因此进入等待状态和唤醒的速度比较快.不过这些数据是保存在内存中 ,如果断电则会使数据丢失.休眠是将当前处于运行状态的数据保存在硬盘中,整机将完全停止供电.因为数据存储在硬盘中,而硬盘速度要比内存低得多,所以进入休眠

汇编语言: 实验七 寻址方式在结构化数据访问中的应用

assume cs:code,ds:data,ss:stackdata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995'dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,14

ARM中的寻址方式

ARM处理器支持9中不同的寻址方式. 1.移位寄存器寻址: 有5种移位方式: LSL:逻辑左移.最低位用0补充,且移出的最后一位存放在cpsr中的C位中. LSR:逻辑右移.最高位用0补充,且移出的最后一位存放在cpsr中的C位中. ASR:算术右移.最高位用符号位补充,且移出的最后一位存放在cpsr中的C位中. ROR:循环右移(不涉及到CPSR中的C位的循环右移).且移出的最后一位存放在cpsr中的C位. RRX:扩展循环右移(带有C位的右移).只循环右移一位,且最高位用cpsr中的C位补充

WIN32汇编语言中位图的使用

说到位图,我们其实很早就接触过,从最早接触计算机,我们应该就知道有图片这个东西,然后再进一步说,图片在电脑上有好几种格式比如jpg. gif .png.pcx.bmp等等,其中bmp格式的图片文件其实就是位图(windows的说法是DIB),位图文件也分为几种(因为存储的位置不同).因为在学的是罗云斌老师的书籍,这次依旧还拿他老人家的程序学习,拓展创新,学为己用,毕竟还不是老手,一步一步走才可以. 了解了位图是什么东西,下面总结一下制作一个能显示位图的时钟的大体流程: 资源脚本文件  1.创建资

汇编语言中的系统调用

系统调用与系统本身的实现方式有关,在不同的操作系统上有很大的区别,例如在uxit 和linux及dos系统上以中断的方式来实现,而由于windows系统的保护模式,汇编程序无法任意中断(除非是处于特权状态下的代码),用户代码通过特定的接口(门)来实现系统调用.前者的调用方式为提供函数的编号(linux系统参见syscall.h,Unix系统参见unistd.h),后者需要提供系统函数在内存中的地址(新的技术使windows的系统加载dll不在加载在特定的位置,而是动态加载,且保护机制对不同的用户

汇编语言中的函数调用

C语言从原则上来说,只能在函数内执行代码. 所以任何 text 段都对应有自己的帧栈. 本文主要谈一下 call leave ret 三条与函数调用紧密相关的指令. call 指令 call 的不同形式 call Label 所谓直接跳转 call *operand 所谓间接跳转 080483f7 <caller>: 804840c: e8 dc ff ff ff call 80483ed <callee> 上边代码段中 caller 中 call 80483ed <call

汇编语言中溢出和进位的区别

of的设置,以加法为例,如果两数符号相同,结果却相反,则of=1:否则of=0:(如果两数符号相反,是不会溢出的).cf的设置,最高有效位(bit7,比如)向高位进位则为1,否则为0.所以实际上of是表示有符号数的溢出,cf是表示无符号数的溢出.理解进位,从af位的设置更为容易.

汇编语言中的错误

│assume cs:code││data segment││ dd 1234567h││data ends│││code segment││ start:mov ax,data│ mov ds,ax│ mov bx,0│ mov word ptr [bx],0000h│ mov [bx+2],cs│ jmp dword ptr ds:[0]││code ends│end start 刚开始 mov word ptr [bx],0000h 写成 mov [bx],0000h 报错operand