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

    汇编指令-adr与ldr伪汇编区别(8)

    adr r0, _start ldr r0, =_start nop mov pc, lr _start: nop 得出以下汇编 c008014 <_start>           //ldr指令(不带=)  :  r0= c008014里面内容= e1a00000  c008004: e28f0008 add r0, pc, #8 ; 0x8 //adr指令:             r0=(当前PC值+8)+0x8=c008014 c008008: e59f0008 ldr r0, [pc, #8] ; c008018 <_start e1a0f00e mov pc, lr 0c008014 <_start>: c008014: e1a00000 nop (mov r0,r0) c008018: 0c008014 stceq 0, cr8,

    1.8K60发布于 2018-01-03
  • 来自专栏Android点滴分享

    汇编学习(8) 宏,IO

    本篇介绍 本篇介绍下汇编中的宏和IO操作,其中IO操作包括控制台IO和文件IO 宏 首先宏并不是汇编支持的,而是nasm 汇编器支持的,这个也容易想到,汇编本身是一套指令,而宏就是将若干指令替换成一个符号 接下来看一个代码例子,nasm汇编的使用; ; macro.asm extern printf %define double_it(r) sal r, 1 ; single line macro 00 00 40113e: 48 be 38 40 40 00 00 movabs rsi,0x404038 401145: 00 00 00 401148: 48 8b mov eax,0x0 401155: e8 d6 fe ff ff call 401030 <printf@plt> 40115a: 48 8b 04 25 00 00 401177: 48 be 4e 40 40 00 00 movabs rsi,0x40404e 40117e: 00 00 00 401181: 48 8b

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

    汇编语言 手记8

    字型数据用两个单元存放,高地址单元放高8位,低地址单元放低8位。

    1.2K50发布于 2018-01-17
  • 来自专栏全栈程序员必看

    Win8下用DOSBox编写汇编语言

    Win8下用DOSBox编写汇编语言 DOSBox 是一个 DOS模拟程序,可以很方便的移植到其他的平台,因此可以使用它在Win8系统中编写汇编语言。 下面提供相关下载链接: DOSBox下载: http://pan.baidu.com/s/1qWwkss0 汇编工具下载: http://pan.baidu.com/s/1i3taKmT DOSBox使用指南: (1)在你的磁盘上新建一个存放自己代码的目录,如:我在E盘下新建一个目录DOS,那么我的工作目录即为:E:\DOS,以后我写的汇编代码就会存放在这个目录下。 (2)选中上面汇编工具的链接(按下Ctrl,鼠标左键单击即可),下载汇编工具。 :\DOS(回车) ;注意这里E:\DOS是你之前创建的工作目录,根据自己的目录输入 第二步: C:(回车) 前两步执行结果如下图, 这样我们就进入了类似win7下DOS的环境,在这里就可以编写汇编程序了

    1.5K20编辑于 2022-07-23
  • 来自专栏乱码三千

    汇编语言之MIPS汇编

    MIPS汇编中的分段处理 .data #数据段 .text #代码段 传送指令 加载立即数指令 li li(load immediate) :用于将立即数传送给寄存器 li $t0,1 ;十六进制数据使用 move 用于将一个寄存器中的数据传送至另一个寄存器当中 move $t0,$t1 # 将寄存器$t1中的数据传送至$t0 系统服务指令 syscall 在C语言中输出文本可以使用printf函数,但是汇编中没有 双精度数(double型)在32位计算机中存储占用8字节,也就是64位,有效位数为16位,小数点后15位。 : scanf("%d",$a); scanf("%d",$b); if(a>b){ printf("YES"); }else{ printf("NO"); } 汇编代码: # 用$t0 ,如果我们要依次打印1,2,3三个整数,那么汇编如下: print1: li $v0,1 li $a0,1 syscall jr $ra print2: li $v0,1 li $a0,2

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

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

    汇编语言--高级汇编技术 子程序的封装 程序的多文件组织 汇编指令汇 数据传送指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制与杂项操作指令 汇编伪操作汇 处理机选择伪操作 段定义伪操作 .exe的诞生 程序运行步骤及生成的文件 汇编过程 宏汇编 C语言中的预处理命令 汇编中的宏---由C中的宏定义说起 举例 语法和术语 子程序VS宏定义 宏中的局部标号 变元是操作码的一部分 宏库 条件汇编 BYTE_ARRAY标号来操作这块内存时,会按字节为单位进行操作 ---- 表达式赋值伪操作 表达式名 EQU 表达式 ALPUA EQU 9 BETA EQU ALPUA+18 BB EQU [BP+8] 因此从10地址处进行分配 VAR1 DW 1234H ORG 20 //从20地址处开始分配 VAR2 DW 5678H //$为上面一条指令的地址 ORG $+8 //在$地址的基础上,加8,然后再对应的地址分配下面这个变量内存空间 VAR3 DW 1357H ALIGN伪操作: 包装数组边界从2的整数次幂地址开始 EVEN伪操作: 使下一个变量或指令开始与偶数字节地址

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

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

    本篇介绍 本篇作为汇编系列的开篇,就先研究下汇编如何写helloworld。 在section .data段用来定义变量,格式如下 <variable name> <type> <value> 类型如下: type length name db 8 bits Byte dw 16 ,格式如下: <variable name> <type> <name> 比如下面是定义了一个 20字的数组 dArray resd 20 类型如下: type length names resb 8 global main 7 main: 8 这样就完成了汇编helloworld的学习了。

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

    汇编语言_汇编语言程序

    int 21h codesg ends end 开头和结尾的两句代表伪指令 只有编译器可以读懂 汇编指令可以被翻译为机器码最终被cpu执行 汇编程序 就是包含汇编指令和伪指令的文本 mov ax,4c00h int 21h 跟C语言程序的return 0一样 返回控制权 一个汇编程序是由多个段组成的 这些段被用作各种空间来使用 一个有意义的汇编程序至少需要一个段 且每个段都需要段名 段名 segment- 255 16位寄存器的范围是65535 可以在dx中存放 不可以将内存字节单元累加到dx 因为dx是十六位 所以如果要用add 则我们需要取出内存字单元 而我们需要的是内存字节单元 dl也不行 累加十二个8位数据到一个 8位寄存器 会导致进位丢失 可以这样做 mov al,ds:[addr] mov ah,0 add dx,ax 这样我们既可以存放下数据 同时也不会因为字单元数据 累加到错误的数据 我们继续完成上面那个示例 assume cs:code code segment dw 0123h,0456h,0abch,0defh,0fedh,0cbah,0987h start:mov bx,0 mov ax,0 mov cx,8

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

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

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

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

    汇编(三)

    对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,在系统中没有提供16位和8位的寄存器供访问和使用。 高速缓存 iPhoneX上搭载的ARM处理器A11它的1级缓存的容量是64KB,2级缓存的容量8M. CPU每执行一条指令前都需要从内存中将指令读取到CPU内并执行。

    94710编辑于 2023-03-23
  • 来自专栏若尘的技术专栏

    初学汇编

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

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

    汇编(七)

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

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

    汇编(二)

    为同样的信息赋予了不同的意义 比如 1110 0000 0000 0011 0000 1000 1010 1010 可以当做数据 0xE003008AA 也可以当做指令 mov x0, x8

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

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

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

    EAX 寄存器内.2.使用 sub eax,edx 指令将高位符号位通过减法减掉.3.使用 sar eax,x 指令完成算数右移除法运算.4.使用 neg eax 将计算后的正数反转为负数.这个过程通过汇编语言实现代码很简单 例如,假设要计算-27除以8的值,我们可以按照如下步骤进行计算:计算27除以8的值,得到商3和余数3。因为被除数为负数,所以对商取反,得到-3。 例如,将-16除以-8,即计算-16/-8的结果,因为8是2的3次幂,所以我们可以通过算数右移指令来完成除法,然后再取反获得正确的结果:将-16右移3位,得到-2。对-2进行取反,得到2。 先来看一段汇编代码,我们此时已知 M = 055555556h 且 edx = N 带入公式 2^(32+N) / M 由于edx没有变化所以此处应计算 2^32 / 055555556h = 2.9999 即可计算出此处的除数是3,而被除数则是ecx寄存器内的值,我们即可得知该段汇编指令在进行 ecx / 3 的计算流程。

    1.6K50编辑于 2023-08-23
  • 5.1 汇编语言:汇编语言概述

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 1.2 汇编中的变量 MASM 定义了多种内部数据类型,每种数据类型都描述了该类型的变量和表达式的取值集合,汇编语言中数据类型的基本特征是以数据位数为度量单位,8,16,32,48,64,80位,而除此之外其他的特征如 REAL4 32位(4字节)短实数 REAL8 64位(8字节)长实数 数据类型定义语句为变量在内存中保留存储空间,并且可以选择为变量指定一个名字,在汇编语言中所有的数据无非就是BYTE的集合,数据的定义语句格式如下 | E73000=10 00E71005 | B8 0130E700 | mov eax,main.E73001 | E73001=20 00E7100A | B8 0230E700 | mov eax,main.E73002 | E73002=30 00E7100F | B8 0330E700

    1.7K50编辑于 2023-10-11
  • 5.6 汇编语言:汇编高效数组寻址

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,实现多维数组的寻址方式相对于C语言来说稍显复杂,但仍然可行。下面介绍一些常用的汇编语言方式来实现多维数组的寻址。 ,读者可自行编译并观察程序的取值过程并以此熟悉这些常用汇编指令集的使用。 在汇编语言中,比例因子可以通过指定一个乘数来实现,这个乘数可以是1、2、4或8,它定义了一个元素相对于数组起始地址的偏移量。 }, { 6, 7, 8, 9 } } }; int x = 1; int y = 2; int z = 3; Array[x][y][z] = 999; return 0;}最终的汇编版如下

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

    汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。 在汇编语言中,乘法指令通常是通过mul(无符号乘法)和imul(有符号乘法)这两个指令实现的。 EAX中 乘法指令计算很简单,只需要累加乘数即可,如下所示则是一个简单的计算三个数相乘的汇编实现; .data x DWORD ? 但读者需要注意,在使用LEA计算乘法时必须要保证乘数是2的次幂,并且乘数的范围必须是2/4/8这三个区间才可使用该指令,我们使用汇编来实现计算eax*8+2其汇编指令如下。 这个计算过程看似复杂,但如果将其转化为汇编指令那么只需要两条即可实现快速乘法运算。 .data x DWORD ?

    74520编辑于 2023-10-11
  • 来自专栏乱码三千

    汇编语言之ARM64汇编

    偏移量为负的 将寄存器w0的值存入x29 - 0x8 的内存地址 [sp]: sp保存栈空间的地址值, [sp]表示取值,获取所对应的空间 和8086中的[bx]是类似的 另外 汇编简写 stp x29 arm代码示例 .text ;代码段 .global _A,_B ;定义两个全局函数 A和B _A: mov x0 ,#0xa0 ;arm汇编中数据用#开头 mov x1 ,#0x00 add .如果超过8个参数,就会入栈. (一是跟参数个数有关,另外还更数据结构有关,指针占用8个字节刚好一个64位寄存器, 如果仓鼠类型超出8个字节,即存放到其他地方,比如栈空间) 函数的返回值通常情况下是放在X0 寄存器里面的. 0x1和0进行或运算, 然后复制给w8 函数嵌套复用 假如有两个函数A和B,它们的调用链为:A–>B–>A 在高级语言中,A函数进行了复用,但是在汇编当中并没有复用的概念,每调用一个函数便开辟一次栈空间

    4.1K60发布于 2021-08-24
  • 来自专栏程序技术知识

    汇编指令

    汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数 操作码 模数 寄存器 无 无 无 无 10 无 无 386 无 $66 JNP 非奇偶跳转 近 $0F8B 无 无 无 无 10 无 无 386 无 $66 JL 小于跳转 近 $0F8C 无 无 无 无 10 无 无 386 无 $66 JNL 不小于跳转 近 $0F8D 无 无 无 无 10 无 无 386 无 $66 JNG 不大于跳转 近 $0F8E 无 无 无 无 10 无 无 386 无 $66 JG 大于跳转 $66 无 JNL 不小于跳转 近 $0F8D 无 无 无 无 10 无 无 386 $66 无 JNG 不大于跳转 近 $0F8E 无 无 无 无 10 无 无 386 $66 无 JG 大于跳转 近 $0F8F 无 无 无 无 10 无 无 386 $66 无 JCXZ 计数一六零跳转 位移8 $E3 无 无 无 无 10 无 无 8086 无 $67 JECXZ 计数三二零跳转 位移8 $E3

    2.1K10编辑于 2021-12-20
领券