首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏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

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

    汇编语言 手记8

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

    1.1K50发布于 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
  • 来自专栏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.3K40编辑于 2022-11-28
  • 来自专栏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.3K31编辑于 2022-07-12
  • 来自专栏乱码三千

    汇编语言之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.8K31发布于 2021-08-24
  • 来自专栏逆向技术

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

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

    2.1K20发布于 2019-05-25
  • 来自专栏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.2K20编辑于 2023-11-14
  • 来自专栏HelloCode开发者学习平台

    汇编(三)

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

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

    汇编指令

    汇编指令: 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
  • 来自专栏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开发者学习平台

    汇编(九)

    接下来我们先写一段C代码,然后通过反汇编来进行分析. 将这个程序运行在ARM64架构的设备上,我们断住func函数.看函数内的汇编 从第9行的汇编代码,也就是蓝色方框内的代码可以看到.这里在调用printf函数.那么参数我们知道是一个字符串"haha" .那么这个串是一个常量,获得它的内存地址,就是7\8两行汇编代码.最终的结果在x0里面,也和我们之前所讲解的知识统一,参数放在了x0寄存器中. 接下来我们解读这两行汇编: adrp x0,1 它的结果是:x0寄存器的值 = 0x1002e6000(当前PC寄存器的低12位清零) + 0x1000(1左移12位) 注意: 从汇编代码左边我们可以看到内存地址 "haha"这个c字符串的物理地址.通过lldb可以打印验证 同理.接下来的汇编代码中,还有一个全局变量,也是通过adrp+add组合获取的物理地址.

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

    汇编(一)

    进制的定义 八进制由8个符号组成:0 1 2 3 4 5 6 7 逢八进一 十进制由10个符号组成:0 1 2 3 4 5 6 7 8 9逢十进一 N进制就是由N个符号组成:逢N进一 做个练习 1 十进制由10个符号组成: 0 1 3 2 8 A B E S 7 逢十进一 如果这样定义十进制: 1 + 1 = 3!就对了! 这样的目的何在? 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 这种二进制使用起来太麻烦,改成更简单一点的符号: 0 1 2 3 4 5 6 7 8 计算机中常见的数据宽度 位(Bit): 1个位就是1个二进制位.0或者1 字节(Byte): 1个字节由8个Bit组成(8位).内存中的最小单元Byte. 但是如果是其他进制.我们就不能转换,要直接学会查表 现在有9进制数 9个符号分别是:2,9,1,7,6,5,4, 8,3 逢9进1 那么: 123 + 234 = ____

    28320编辑于 2023-03-23
  • 来自专栏landv

    golang 汇编

    在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于plan9,此方面的 介绍很多,就不进行展开了。我们WHY和HOW开始讲起。 函数声明 首先我们先需要对go汇编代码有一个抽象的认识,因此我们可以先看一段go汇编代码: TEXT runtime·profileloop(SB),NOSPLIT,$8-16 MOVQ $runtime 对于手写汇编来说,所有参数通过栈来传递,通过伪寄存器FP偏移进行访问。函数的返回值跟随在输入参数 后面,并且对其到指针大小。amd64平台上指针大小为8byte。如果输入参数为20byte。 因此我们写汇编 代码时,也最好将栈起始位置存储在BP寄存器中。因此在amd64平台上,会在函数返回值之后插入8byte来放置CALLER BP寄存器。 编译/反编译 因为go汇编的资料很少,所以我们需要通过编译、反汇编来学习。

    1.9K40发布于 2019-09-27
  • 来自专栏yifei的专栏

    汇编笔记

    汇编 win10下环境配置 https://blog.csdn.net/yuzuruhanyu/article/details/80287419 https://www.cnblogs.com/zyever /p/7919007.html 王爽汇编课后答案 dosbox快捷键 alt+enter 全屏 ctrl+F10 显示/隐藏鼠标 ctrl+F11 减速 ctrl+F12 加速 ctrl+F9 强制退出 处开始逐个改写内存 6D.** 72.** 33.** d 1000:10 e 1000:0 'a' 'b' 'c' 3 4 5 "aaa" "bbb" //可以写入字符 数字 字符串 U 将机器指令翻译为汇编指令 u 1000:0 A 以汇编格式在内存中写入一条机器指令 a 1000:0 1000:0000 mov ax,1 ... ... 1000:000f<回车> T 执行一条机器指令 t 数据复制 movsb 字节转移 movsw 字转移 王爽汇编第三版印刷错误 p144 0006H p256/257 两页印反 p266 访问8位端口? p267 左移后的数据 欢迎与我分享你的看法。

    67440编辑于 2022-11-14
  • 来自专栏HelloCode开发者学习平台

    汇编(四)

    此ldr 和 str 的变种ldp(pair) 和 stp(pair) 还可以操作2个寄存器.

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

    汇编(八)

    注:CPSR寄存器是32位的 CPSR的低8位(包括I、F、T和M[4:0])称为控制位,程序无法修改,除非CPU运行于特权模式下,程序才能修改控制位! N、Z、C、V均为条件码标志位。

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

    初学汇编

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

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

    汇编(二)

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

    1K20编辑于 2023-03-23
领券