首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

汇编语言中的PUSH指令是零地址指令还是单地址指令?

PUSH指令在汇编语言中通常被归类为单地址指令。这是因为PUSH指令的操作数只有一个,即要被压入堆栈的数据。尽管PUSH指令的操作涉及到两个地址(堆栈指针和数据地址),但实际上只有一个操作数地址被显式地指定。

基础概念

  • 零地址指令:这类指令不需要操作数地址,操作数隐含在指令的操作码中。
  • 单地址指令:这类指令只有一个操作数地址,另一个操作数通常是隐含的或者通过计算得到。

PUSH指令的优势

  • 数据保护:PUSH指令常用于保存寄存器的值,以便在执行其他操作后能够恢复这些值。
  • 参数传递:在函数调用中,PUSH指令用于将参数压入堆栈,以便被调用的函数能够访问这些参数。

应用场景

  • 函数调用:在C语言等高级语言中,函数调用时通常会使用PUSH指令将参数压入堆栈。
  • 局部变量保存:在函数内部,如果需要使用寄存器而该寄存器之前存放了重要数据,可以使用PUSH指令先将数据保存到堆栈。

示例代码(x86汇编语言):

代码语言:txt
复制
section .data
    msg db 'Hello, World!', 0

section .text
    global _start

_start:
    ; 将字符串地址压入堆栈
    push msg

    ; 调用系统调用打印字符串
    mov eax, 4          ; 系统调用号:sys_write
    mov ebx, 1          ; 文件描述符:stdout
    mov ecx, esp        ; 消息地址
    mov edx, 13         ; 消息长度
    int 0x80            ; 触发系统调用

    ; 退出程序
    mov eax, 1          ; 系统调用号:sys_exit
    xor ebx, ebx        ; 退出码:0
    int 0x80            ; 触发系统调用

参考链接

通过上述解释和示例代码,您可以更好地理解PUSH指令在汇编语言中的作用和应用场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

汇编语言基础教程-指令:传送,交换,取地址

源操作数不能立即数 如: mov al,82h movsx  bx,al  ;此时bx为:0FF82H,BX高八位设置为1 4.xchg 将原操作数与目的操作数内容进行交换 两个操作数必须有一个通用寄存器...如: xchg  eax,ebx 5.bswap 如: bswap eax 该指令意思将eax高字节和低字节内容互换 中间两个字节内容互换 操作数必须一个32位寄存器 6.lea 把源操作数有效地址传递给目标操作数...如: lea eax,dvar 此指令与如下指令效果相同 lea eax,offset  dvar 在内存代码分别为: lea eax,[0040400a] mov eax,0040400a 另:...->40 00404042--->40 00404043--->00 00404044--->23 00404045--->00 那么lds  esi,fvar指令执行之后 esi内容为0040407dH...DS内容为0023H 在win32编程很少用到段寄存器!!!

61920

周期CPU指令周期就是一个时钟周期_指令周期和时钟周期关系

大家好,又见面了,我你们朋友全栈君。...一个指令周期包含机器周期个数亦与指令所要求动作有关,如操作数指令,只需要一个取操作数周期,而双操作数指令需要两个取操作数周期。...取指周期:在取指周期中CPU主要完成两个操作:(1)按程序计数器PC内容取指令(2)形成后继指令地址; 间址周期:当遇到间接寻址指令时,由于指令只给出操作数有效地址地址,因此,为了取出操作数...执行周期:间址周期取出操作数有效地址。执行周期取出操作数,并执行。...在这阶段, CPU必须将程序断点保存到存储器。 每个指令CPU周期不同,每个CPU周期长度也不同。

2.2K20
  • 汇编语言入门教程

    汇编语言二进制指令文本形式,与指令一一对应关系。比如,加法指令00000011写成汇编语言就是 ADD。只要还原成二进制,汇编语言就可以被 CPU 直接执行,所以它是最底层低级语言。...为了解决二进制指令可读性问题,工程师将那些指令写成了八进制。二进制转八进制轻而易举,但是八进制可读性也不行。很自然地,最后还是用文字表达,加法指令写成 ADD。...但是,CPU 缓存还是不够快,另外数据在缓存里面的地址不固定,CPU 每次读写都要寻址也会拖慢速度。因此,除了缓存之外,CPU 还自带了寄存器(register),用来储存最常用数据。...每一个寄存器都有自己名称,我们告诉 CPU 去具体哪一个寄存器拿数据,这样速度最快。有人比喻寄存器 CPU 级缓存。...push %ebx 这一行里面,push CPU 指令,%ebx指令要用到运算子。一个 CPU 指令可以有个到多个运算子。

    1K43

    汇编语言入门教程

    汇编语言二进制指令文本形式,与指令一一对应关系。比如,加法指令00000011写成汇编语言就是 ADD。只要还原成二进制,汇编语言就可以被 CPU 直接执行,所以它是最底层低级语言。...为了解决二进制指令可读性问题,工程师将那些指令写成了八进制。二进制转八进制轻而易举,但是八进制可读性也不行。很自然地,最后还是用文字表达,加法指令写成 ADD。...但是,CPU 缓存还是不够快,另外数据在缓存里面的地址不固定,CPU 每次读写都要寻址也会拖慢速度。因此,除了缓存之外,CPU 还自带了寄存器(register),用来储存最常用数据。...每一个寄存器都有自己名称,我们告诉 CPU 去具体哪一个寄存器拿数据,这样速度最快。有人比喻寄存器 CPU 级缓存。...push %ebx 这一行里面,push CPU 指令,%ebx指令要用到运算子。一个 CPU 指令可以有个到多个运算子。

    1.1K40

    iOS逆向之ARM64汇编基础

    首先汇编语言操作起来还是挺麻烦,一个简单数学运算需要执行多条指令行,我们需要清楚每一步操作,完全“面向过程”。...其次因为汇编语言指令描述,汇编语言包括一条条指令,所以当指令集改变时,就得修改相应汇编语言,导致其可移植性很差。不能跨平台使用,比如ARM汇编语言与Intel X86就格格不入。...加载/存储指令 1.加载(load)、存储(store)指令都是成对出现 2.无论加载还是存储相关指令指令后面都只能写寄存器,不能把寄存器放到指令最后面。...64位x86_64系列CPU,进行1次栈push或pop操作,即可处理64位(8字节)数据。 在数据入栈和出栈时候,不需要指定“哪一个地址编号内存进行push或pop”。...这是因为对栈读写内存地址由SP寄存器(栈指针寄存器)进行管理。数据入栈或出栈后,SP寄存器值会自动更新(32位CPU下,push指令会使SP存储地址-4字节,pop指令+4字节)。

    9.3K32

    go语言调度器源代码情景分析之五:汇编指令

    汇编语言每位后端程序员都应该掌握一门语言,因为学会了汇编语言,不管对我们调试程序还是研究与理解计算机底层一些运行原理都具有非常重要作用,所以建议有兴趣读者可以多花点时间把它学好。...)寄存器名字用括号括起来了,表示间接寻址,rsp一个内存地址,这条指令真实意图把rax寄存器值赋值给rsp寄存器值(内存地址)对应内存,rsp寄存器本身值不会被修改,作为比较,...很遗憾cpu没有提供相应指令,我们只能通过多条指令组合起来达到目的。 常用指令详解 x86-64汇编指令上千条,这里不会去详细讲解每一条,读者如果有兴趣可以参考汇编语言相关教程。...同时还需要注意这里call指令执行时把call指令后面那一条指令地址 0x40055e PUSH到了栈上,所以一条call指令修改了3个地方值:rip寄存器、rsp和栈。...可以看到ret指令执行操作跟call指令执行操作完全相反,ret指令开始执行时rip寄存器紧跟ret指令后面的那个地址,也就是0x400540,但ret指令执行过程中会把之前call指令PUSH

    1.1K21

    汇编语言】第三章----寄存器(内存访问)(九)—— push、pop指令以及例题分析与讲解

    ,我们可以: 例如: push [0] pop [2] 指令执行时,CPU要知道内存单元地址,可以在push、pop指令只给出内存单元偏移地址,段地址指令执行时,CPU从ds取得。...、BX清; (5)从栈恢复AX、BX原来内容。...分析与求解: 首先,我们来看题目中已经给出最后两条指令将ax2266H入栈,也就是说,最终应由push ax将2266H写入10000H处。...一定要注意:它执行过程,先将记录栈顶偏移地址SP寄存器内容减2,使得SS:SP指向新栈顶单元,然后再将寄存器数据送入SS:SP指向顶单元。...总结 push、pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同push和pop指令访问内存单元地址不是在指令给出,而是由SS:SP指出

    15510

    NASM Overview

    AX 16 位数相乘得到结果存储在 DX:AX ; mul 执行后,如果结果高位全是则 OF 和 CF 清,否则置一,对 SF ZF AF 和 PF 标志位影响未定义。...movs 命令可以使用重复执行,方向标志位 DF 决定了 SI 和 DI 在次操作后增加(0)还是减少(1) 每次变动大小与具体执行命令有关:movsb -> 1B | movsw -> 2B |...jz:如果标志位 ZF = 1,则跳转到指定地址。 jnz:如果标志位 ZF = 0,则跳转到指定地址。 ZF:标志位,相关指令执行后结果是否为 | 0 -> 否 | 1 -> 。...jasonM:一步步学习汇编(10)之jmp指令原理分析(破解软件必修课) FullSky:8086运算、位移、处理器指令 知乎-愛等待细水长流:汇编语言–x86汇编指令集大全 blubiu:汇编语言笔记...(七)–DIV指令(除法指令) CSDN-YiShiWenYan:汇编PTR含义 退思园:关于汇编PTR操作符 511遇见: 汇编语言标志寄存器cmp 指令 Demon’s Blog:汇编语言

    2.9K20

    逆向工程——汇编基础

    push/pop指令 push 寄存器:将一个寄存器数据压入堆栈; pop 寄存器:将栈顶数据弹出堆栈,并传入指定寄存器。...通过堆栈窗口我们可以看到: 堆栈结构从下往上减少; 栈顶位置0021f7bc; 两个相邻地址相差4h。 POP/PUSH操作 PUSH EAX: ?...毋庸置疑,堆栈在整个过程中发挥着非常重要作用。不过,本质上对子程序最重要还是返回地址,如果子程序不知道这个地址,那么系统将会崩溃。...调用子程序指令CALL,对应返回指令RET,另外还有ENTER和LEAVE,她们可以帮助进行堆栈维护。 CALL指令参数被调用子程序地址。使用宏汇编时候,这通常是一个标号。...子程序一个不错主意,不过,CALL指令需要指定地址,让外设强迫CPU执行一条CALL指令也违背了CPU作为核心控制单元设计初衷。考虑到这些,这x86系统引入了中断向量概念。

    1.2K10

    计算机底层知识之汇编语言

    「寄存器CPU存储区域」。不过,寄存器并不仅仅具有存储指令和数据功能,也有运算功能。寄存器名称会通过汇编语言源代码指定给操作数。内存存储区域用「地址编号」来区分。...栈「存储临时数据区域」,它特点通过push指令和pop指令进行数据存储和读出。push指令和pop指令只有一个操作数。...该操作数表示push是什么及pop是什么」,而不需要指定”对哪一个地址编号内存进行push或pop“。 这是因为,对栈进行读写内存地址有esp寄存器(栈指针)进行管理。...push指令和pop指令运行后,esp寄存器值会「自动进行更新」(push指令-4,pop指令+4),因而就没有必要指定内存地址了。 ---- 函数调用机制 假设存在如下C语言代码片段。...(5)call指令,把程序流程跳转到了操作数中指定AddNum函数所在内存地址处。在汇编语言中,「函数名表示函数所在内存地址」。

    41110

    汇编语言从入门到精通-5微机CPU指令系统1

    微机CPU指令系统 5.1 汇编语言指令格式   为了介绍指令系统中指令功能,先要清楚汇编语言如何书写指令,这就象在学习高级语言程序设计时,要清楚高级语言语句语义、语法及其相关规定一样。...指令主要功能和限制与MOV指令类似,不同之处:在传送时,对目的操作数高位进行填充。根据其填充方式,又分为:符号填充和填充。   传送—填充指令功能如图5.2所示。 ? ? (a)....2、填充指令MOVZX(Move with Zero-Extend)     MOVZX填充方式:恒用0来填充目的操作数高位数据位。   ...4、取有效地址指令LEA(Load Effective Address)   指令LEA把一个内存变量有效地址送给指定寄存器。...1、OFFSET将数值回送变量或标号偏移地址值.      2.LEA将数值回送变量或标号有效地址值.     3.SEG, 汇编程序将回送变量或标号地址值.      4、LEA  BX,

    1K30

    程序员必须掌握 CPU 硬核干货!

    作为一名程序员,与计算机打交道日子不计其数。 ? 不管你玩硬件还是做软件,你世界自然都少不了计算机最核心——CPU。 01 CPU是什么?...因此,可以说 CPU 一系列寄存器集合体。 一般,在内存存储通过地址编号来表示,寄存器种类通过名字来区分。...09 标志寄存器 条件和循环分支会使用到 jump(跳转指令), 会根据当前指令来判断是否跳转,上面我们提到了标志寄存器, 无论当前累加寄存器运算结果正数、负数还是,标志寄存器都会将其保存。...而无论减法运算结果正数、还是负数,都会保存到标志寄存器。 结果为正表示 XXX 比 YYY 大,结果为表示 XXX 和 YYY 相等,结果为负表示 XXX 比 YYY 小。...,识别区分出不同指令类别和各种获取操作数方法; 执行指令阶段任务完成指令所规定各种操作,具体实现指令功能; 访问取数阶段任务:根据指令地址码,得到操作数在主存地址,并从主存读取该操作数用于运算

    47820

    程序员需要了解硬核知识之汇编语言(一)

    汇编语言中,这种相当于 C 语言函数形式称为过程。 末尾 end 伪指令,表示源代码结束。 汇编语言语法 操作码 + 操作数 在汇编语言中,一行表示一对 CPU 一个指令。...栈存储临时数据区域,它特点通过 push 指令和 pop 指令进行数据存储和读出。...(5) 表示 call 指令,会把程序流程跳转到 AddNum 函数指令地址处。在汇编语言中,函数名表示就是函数所在内存地址。...call 指令运行后,call 指令下一行(也就指的是 (6) 这一行)内存地址(调用函数完毕后要返回内存地址)会自动 push 入栈。...(2) 把负责管理栈地址 esp 寄存器值赋值到了 ebp 寄存器。这是因为,在 mov 指令中方括号内参数,不允许指定 esp 寄存器

    62310

    汇编语言】寄存器(内存访问)(七)—— CPU提供栈机制

    前言 汇编语言很多相关课程(如数据结构、操作系统、微机原理)重要基础。...8086CPU提供入和出栈指令,最基本两个PUSH(入栈)和POP(出栈)。 比如,push ax 表示将寄存器ax数据送入栈,pop ax 表示从栈顶取出数据送入 ax。...注意,字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位 大家看到上图所描述 push 和 pop指令执行过程,是否有一些疑惑? 总结一下,大概这两个问题。...我们现在知道答案,那就是CS、IP存放着当前指令地址和偏移地址。 现在问题:CPU如何知道栈顶位置?...push指令和pop指令执行时,CPU从SS和SP得到栈顶地址。 2. push指令 现在,我们可以完整地描述push和pop指令功能了,例如push ax。

    7510

    程序员需要了解硬核知识之CPU

    这是 Java 建设者第 39 篇原创文章 大家都是程序员,大家都是和计算机打交道程序员,大家都是和计算机软件硬件打交道程序员,大家都是和CPU打交道程序员,所以,不管你玩儿硬件还是做软件...地址指令,将数值输出到显示器,然后结束程序,0103 指令被跳过了,这就和我们程序 if() 判断一样,在不满足条件情况下,指令会直接跳过。...标志寄存器 条件和循环分支会使用到 jump(跳转指令),会根据当前指令来判断是否跳转,上面我们提到了标志寄存器,无论当前累加寄存器运算结果正数、负数还是,标志寄存器都会将其保存(也负责溢出和奇偶校验...而无论减法运算结果正数、还是负数,都会保存到标志寄存器。结果为正表示 XXX 比 YYY 大,结果为表示 XXX 和 YYY 相等,结果为负表示 XXX 比 YYY 小。...访问取数阶段,根据指令需要,有可能需要从内存中提取数据,此阶段任务:根据指令地址码,得到操作数在主存地址,并从主存读取该操作数用于运算。

    88210

    对X86汇编理解与入门

    汇编语言中,相邻定义标签在内存连续存放。 .DATA var DB 64 ;声明一个字节,并将数值64放入此字节 var2 DB ? ; 声明一个为初始化字节....,但是,对于 mov [ebx], 2 如果没有特殊标识,则不确定常数2单字节、双字节,还是双字。......) push指令将操作数压入内存,栈程序设计中一种非常重要数据结构,其主要用于函数调用过程,其中ESP只是栈顶。...4直接内容压栈 pop— Pop stack pop指令push指令相反,它执行出栈工作。...由于参数传递在子程序被调用之前,所以参数总是在ebp指示地址下方(在栈),因此,上例第一个参数地址ebp+8,第二个参数地址ebp+12,第三个参数地址ebp+16;而局部变量在ebp

    1.9K42

    程序员需要了解硬核知识之汇编语言(全)

    存储临时数据区域,它特点通过 push 指令和 pop 指令进行数据存储和读出。...(5) 表示 call 指令,会把程序流程跳转到 AddNum 函数指令地址处。在汇编语言中,函数名表示就是函数所在内存地址。...call 指令运行后,call 指令下一行(也就指的是 (6) 这一行)内存地址(调用函数完毕后要返回内存地址)会自动 push 入栈。...(2) 把负责管理栈地址 esp 寄存器值赋值到了 ebp 寄存器。这是因为,在 mov 指令中方括号内参数,不允许指定 esp 寄存器。...现在基本上没有人用汇编语言来编写程序了,因为 C、Java等高级语言效率要比汇编语言快很多。不过,汇编语言经验还是很重要,通过借助汇编语言,我们可以更好了解计算机运行机制。

    93520

    C++嵌入汇编语言计算有符号数组平均值

    本文链接:https://blog.csdn.net/weixin_42449444/article/details/102556037 关于嵌入汇编: 嵌入汇编指在C和C++源程序插入汇编语言指令...使用“__asm”关键字既可以引导条回汇编语言指令,也可以用空格在同一行分隔多个“__asm”引导汇编语言指令,更好方法使用花括号书写一个汇编语言程序片段。...例如,在汇编语言编写函数,不必保存EAX、EBX、ECX、EDX、ESI和EDI寄存器,但必须保存函数中使用其它寄存器(如ESP、EBP和整数标志寄存器等)。...嵌入式汇编语言语句中,可以使用汇编语言格式表示整数常量(如378H),也可以使用C++格式来进行表示(如0x378)。嵌入式汇编标号和C++标号相似,它作用是在定义它函数中有效。...在VC++集成开发环境,建立一个win32控制台程序项目,输入源代码后进行编译连接就可以产生一个可执行文件。需要注意:debug活动解决方案平台一定要选X86!不能够X64!

    1.9K10

    【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构动态库文件 | x86 汇编语言分析 )

    文章目录 一、x86 汇编语言分析 一、x86 汇编语言分析 ---- 在上一篇博客 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构动态库文件 | 使用 IDA 打开动态库文件...: 程序执行过程 , esp 地址 , 程序执行过程需要用到 esp 变量 , 最好不要直接修改 esp , 这里将 esp 拷贝到 ebp , ebp 全程没有修改以及使用 , 函数执行完毕后..., 保护这些值 , 函数执行完毕后再出栈 , 将这些值还原 , 其中 eax 不用入栈 , eax 用于记录返回值 , 该值肯定要进行修改 ; push ebx push edi push...含义当前指令 + 5 , 即执行下一条指令 , 每个指令长度 5 字节 ; 该指令可能是为了兼容 arm 代码而生成 ; 调用 call 指令后 , 会将下一条要执行指令放到栈 ; call...$+5 该行指令对应机器码如下 : 上面 call 调用后 , 会将下一条要执行指令地址放到栈 ; 这里使用 pop 将指令地址从栈取出 , 放到 ebx ; 从栈取到值实际上

    1.5K30
    领券