首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Android点滴分享

    汇编学习(7), Bit 操作

    本篇介绍 本篇介绍下汇编中的bit操作。 db "SHL 2 lower byte of number 1",10,0 msg6 db "SHR 2 lower byte of number 1",10,0 msg7 bit #61, that is the 62nd bit:",10,0 msg6 db 10,"Clear bit #8, that is the 9th bit:",10,0 msg7 [bitflags],4 ; set bit 4 ;print bitflags mov rdi, [bitflags] call printb ;set bit 7 is the 5th bit: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00010000 Set bit #7,

    58140编辑于 2022-12-11
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    汇编语言 手记7

    CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址; 在8086PC中,内存地址由段地址和偏移地址组成。 8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。 mov al,[0]  mov已知的功能: 1 将数据直接送入寄存器 2 将一个寄存器中的内容送入另一个寄存器中。 3 将一个内存单元中的内容送入一个寄存器。 8086CPU不支持将数据直接放入段寄存器DS中。 将数据从寄存器写入内存单元: mov bx,1000H mov ds,bx   将段地址设置为ds中的地址 mov

    1.2K90发布于 2018-01-17
  • 来自专栏Linux驱动

    汇编指令-MOV与ldr区别(7)

    MOV 1.可以寄存器与寄存器之间传递数据 2.可以常数传递到寄存器中(常数不能超过32位) LDR 1.可以地址与寄存器之间的数据传递 2.也可以常数传递到寄存器中 实例: 1.r1与r2之间传递就只能用MOV: MOV r1,r2 2.常数传递到寄存器可以使用MOV和ldr: MOV r0,#0 ldr r0,=0 3.寄存器与地址0X00000000之间传递数据只能用ldr: ldr r0,=0X30000000 ldr r0,0X00000000

    1K51发布于 2018-01-03
  • 来自专栏嵌入式ARM和Linux

    MIPS架构深入理解7-汇编语言理解

    阅读MIPS汇编代码,不仅仅需要熟悉各个机器指令,因为它还包括许多MACRO,这些宏由GNU工具链识别,将其展开成真正的机器指令。这些宏的存在是为了更方便地编写汇编程序。 通常,编程人员会将汇编代码以更具有可读性的源文件(后缀.S)传递给预处理器,由预处理器进行宏展开、别名替换等等操作,然后形成真正的预处理后的汇编文件(后缀.s表示)。 .end 标记结束 .set伪指令: 设置汇编器的工作方式。默认情况下,汇编器尝试填充分支指令和存取指令造成的空闲时间,通过重新排列指令。 9.2 语法概述 上面我们对汇编代码已经有了一些感官上的认识,下面我们就系统地学习一下汇编的语法。 ,则需要汇编器额外帮助。

    4.3K20编辑于 2022-08-15
  • 来自专栏乱码三千

    汇编语言之MIPS汇编

    $a0-$a3 参数寄存器(Argument简写) $8-$15 $t0-$t7 一般用于存储临时变量(temp简写) $16-$23 $s0-$s7 存放子函数调用过程需要被保留的数据(saved values MIPS汇编中的分段处理 .data #数据段 .text #代码段 传送指令 加载立即数指令 li li(load immediate) :用于将立即数传送给寄存器 li $t0,1 ;十六进制数据使用 move 用于将一个寄存器中的数据传送至另一个寄存器当中 move $t0,$t1 # 将寄存器$t1中的数据传送至$t0 系统服务指令 syscall 在C语言中输出文本可以使用printf函数,但是汇编中没有 : scanf("%d",$a); scanf("%d",$b); if(a>b){ printf("YES"); }else{ printf("NO"); } 汇编代码: # 用$t0 #需求:实现int a[3][3] = {{1, 2, 3}, {5, 6, 7}, { 10, 11, 12}}; #以下是以 行不动 列轮动的方式实现 .data da: .word 1,2,3,5,6,7,10,11,12

    10.8K31发布于 2021-08-24
  • 来自专栏c++与qt学习

    汇编语言--高级汇编技术

    汇编语言--高级汇编技术 子程序的封装 程序的多文件组织 汇编指令汇 数据传送指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制与杂项操作指令 汇编伪操作汇 处理机选择伪操作 段定义伪操作 程序开始和结束伪操作 数据定义及存储器分配伪操作 表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作 汇编操作符汇总 算术操作符 逻辑和移位操作符 关系操作符 数值回送操作符 属性操作符 汇编过程 .exe的诞生 程序运行步骤及生成的文件 汇编过程 宏汇编 C语言中的预处理命令 汇编中的宏---由C中的宏定义说起 举例 语法和术语 子程序VS宏定义 宏中的局部标号 变元是操作码的一部分 宏库 条件汇编 会按字节为单位进行操作 ---- 表达式赋值伪操作 表达式名 EQU 表达式 ALPUA EQU 9 BETA EQU ALPUA+18 BB EQU [BP+8] = 伪操作(可以重复定义) EMP=7 TABLE DB 'ABCD' ---- 属性操作符 ---- 汇编过程 .exe的诞生 ---- 程序运行步骤及生成的文件 ---- 汇编过程 ---- 宏汇编 C语言中的预处理命令 -

    2.3K31编辑于 2022-07-12
  • 来自专栏Android点滴分享

    汇编学习(1),汇编之helloworld

    本篇介绍 本篇作为汇编系列的开篇,就先研究下汇编如何写helloworld。 信息,-F dwarf用来指定debug信息格式是dwarf,-l用来生成机器码和汇编的对应文件。 汇编程序一般由data,bss,text 3个段构成, 前面加section就是定义这是某个段。 section .text 6 global main 7 这样就完成了汇编helloworld的学习了。

    1.3K40编辑于 2022-11-28
  • 来自专栏Republic博客

    汇编语言_汇编语言程序

    可以来看一段汇编源程序 assume cs:codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end 开头和结尾的两句代表伪指令 只有编译器可以读懂 汇编指令可以被翻译为机器码最终被cpu执行 汇编程序 就是包含汇编指令和伪指令的文本 mov ax,4c00h int 21h 跟C语言程序的return 0一样 返回控制权 一个汇编程序是由多个段组成的 这些段被用作各种空间来使用 一个有意义的汇编程序至少需要一个段 且每个段都需要段名 段名 segment- stack ends code segment start: mov ax,stack mov ss,ax mov sp,20h mov ax,data mov ds,ax mov bx,0 mov cx,7 s:push [bx] add bx,2 loop s mov bx,0 mov cx,7 s0:pop [bx] add bx,2 loop s0 mov ax,4c00h int 21h code

    1.2K20编辑于 2023-11-14
  • 来自专栏逆向技术

    汇编知识扫盲之常见汇编指令

                   汇编知识扫盲之常见汇编指令 一、数据传输指令     它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   1. 通用数据传送指令.        

    2.1K20发布于 2019-05-25
  • 来自专栏HelloCode开发者学习平台

    汇编(三)

    对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,在系统中没有提供16位和8位的寄存器供访问和使用。其中32位的寄存器是64位寄存器的低32位部分并不是独立存在的。

    90010编辑于 2023-03-23
  • 来自专栏HelloCode开发者学习平台

    汇编(五)

    接下来我们看下这个Demo 新建项目(单个视图的空项目) CMD + SHIFT + N 选择真机(如果是模拟器汇编指令将不一样) CMD + N 新建文件,选择 Assembly File( Empty也可以,后缀名加上.s就OK) 写点汇编代码 来到main.m文件 运行的结果是怎样?

    49810编辑于 2023-03-23
  • 5.7 汇编语言:汇编高效乘法运算

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,乘法指令通常是通过mul(无符号乘法)和imul(有符号乘法)这两个指令实现的。 但读者需要注意,在使用LEA计算乘法时必须要保证乘数是2的次幂,并且乘数的范围必须是2/4/8这三个区间才可使用该指令,我们使用汇编来实现计算eax*8+2其汇编指令如下。 + 10的最终结果这个计算过程看似复杂,但其实在汇编层面并不难构建,如下分别实现计算两个表达式求值过程。. ; edx = edx + eax sub edx,7 ; edx = edx - 7 invoke crt_printf,addr

    76620编辑于 2023-08-23
  • 5.8 汇编语言:汇编高效除法运算

    计算时我们需要参考次方表,这里我列举出几个常用的次方数值:次方表: 1=>2 2=>4 3=>8 4=>16 5=>32 6=>64 7=>128次方表: 8=>256 9=>512 10=>1024 invoke crt_printf,addr szFmt,eax ; 计算 10 / -8 mov eax,dword ptr ds:[x] cdq and edx,7 ExitProcess,0 main ENDPEND main如上我们所有的除法运算中,无论是有符号还是无符号都在进行2的次幂运算,通常针对2的次幂运算并不需要经过特殊的模M计算,而对于非2次幂3/5/7的运算 先来看一段汇编代码,我们此时已知 M = 055555556h 且 edx = N 带入公式 2^(32+N) / M 由于edx没有变化所以此处应计算 2^32 / 055555556h = 2.9999 即可计算出此处的除数是3,而被除数则是ecx寄存器内的值,我们即可得知该段汇编指令在进行 ecx / 3 的计算流程。

    1.5K50编辑于 2023-08-23
  • 来自专栏若尘的技术专栏

    初学汇编

    什么是汇编器和链接器? 汇编器(assembler):用于将汇编语言源程序转换为机器语言 链接器(linker):一种工具程序,把编译器生成的单个文件组合成一个可执行文件 寄存器(register):是 CPU 中被命名的存储位置 汇编语言于机器语言是一对一(one-to-one)的关系:每一条汇编语言指令对应一条机器语言指令。 C++ 和 Java 与汇编语言有什么关系? 汇编语言是不可移植的。因为它是为特定处理器系列设计的。汇编语言会直接与计算机体系结构相匹配。 汇编语言有规则吗? 大多数汇编语言规则都是以目标处理器及其机器语言的物理局限性为基础的。如:CPU 要求两个指令操作数的大小相同。汇编语言的规则较少。

    1.4K117发布于 2021-05-22
  • 来自专栏HelloCode开发者学习平台

    汇编(二)

    寄存器 内部部件之间由总线连接 对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制 不同的CPU,寄存器的个数、结构是不相同的 通用寄存器 ARM64拥有有31个64位的通用寄存器 x0 到 x30,这些寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途) 那么w0 到 w28 这些是32位的. 因为64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位. 比如 w0 就是 x0的低32位! 通常,CPU会先将内存中的数据存储到通用寄

    1K20编辑于 2023-03-23
  • 来自专栏HelloCode开发者学习平台

    汇编(七)

    函数的局部变量 接下来我们新建项目,在main.m文件中写下如下代码 断点断住sum函数.我们看看sum函数内部的汇编. 我们可以看到.sp拉伸了16个字节. 接下来我们修改一下代码在看看sum函数的汇编 接来下sum函数里面.栈拉伸了32个字节(ARM64中对sp的操作是16字节对齐的,也就是16的整数倍). 我们来看下下面的案例: 从汇编可以看出.我们一旦是嵌套调用,就立刻多开辟了16个字节的空间. 因为只要是嵌套调用,我们需要保护x29和x30两个寄存器(本函数调用的返回地址,"回家的路").

    67420编辑于 2023-03-23
  • 来自专栏程序技术知识

    汇编指令

    汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数 操作码 模数 寄存器 无 8086 无 无 JS 负号跳转 短 $78 无 无 无 无 10 无 无 8086 无 无 JNS 非负跳转 短 $79 无 无 无 无 10 无 无 8086 无 无 JP 奇偶跳转 短 $7A 无 无 无 无 10 无 无 8086 无 无 JNP 非奇偶跳转 短 $7B 无 无 无 无 10 无 无 8086 无 无 JL 小于跳转 短 $7C 无 无 无 无 10 无 无 8086 无 无 JNL 不小于跳转 短 $7D 无 无 无 无 10 无 无 8086 无 无 JNG 不大于跳转 短 $7E 无 无 无 无 10 无 无 8086 无 无 JG 大于跳转 短 $7F 无 无 无

    2.1K10编辑于 2021-12-20
  • 5.6 汇编语言:汇编高效数组寻址

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,实现多维数组的寻址方式相对于C语言来说稍显复杂,但仍然可行。下面介绍一些常用的汇编语言方式来实现多维数组的寻址。 以比例因子寻址为例,可以使用汇编指令lea和mov来模拟实现二维数组的寻址操作。 }, { 5, 6, 7, 8 }, { 6, 7, 8, 9 } } }; int x = 1; int y = 2; int z = 3; Array[x][y][z windows.inc include kernel32.inc includelib kernel32.lib .data MyArray DWORD 1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7,5,6,7,8,6,7,8,9,0h

    68440编辑于 2023-10-11
  • 来自专栏HelloCode开发者学习平台

    汇编(六)

    然后我们看一下汇编代码.选择Xcode的Debug->Debug Workflow->Always Show Disassembly 可以调试查看汇编指令 然后当我们进入到sum函数里面之后.看下sum 函数中的汇编指令.如下图 可以看到.参数取出来进行加法运算是从w1和w0(x0,x1的低32位) 里面取出来的. 有了这样一个结论.我们就可以使用ARM汇编.写一个不严谨的求和的函数了 新建一个.s文件,代码如下 main.m文件代码 运算结果没问题. 那么我们可以发现.在汇编中,x0保存的是我们函数的返回值. ARM64下,函数的参数通常情况下是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,就会入栈.

    44410编辑于 2023-03-23
  • 来自专栏HelloCode开发者学习平台

    汇编(八)

       CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同).这种寄存器在ARM中,被称为状态寄存器就是CPSR(current program status register)寄存器 CPSR和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义.而CPSR寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息.

    43410编辑于 2023-03-23
领券