assembly register

#flashcards/ComputerScience

本质上是一个非常小的内存空间。物理位置非常接近处理器,因此它们使用非常快。 每个程序会大量的访问寄存器。

particle

CPUlator ARMv7 System Simulator (01xz.net)

.global _start
.section .text
_start:
	mov r0, #42 
	mov r8, #11
	mov r7, #3
	swi 0
	mov r8, #11
addressRegisters
r00000002a
r100000000
r200000000
r300000000
r400000000
r500000000
r600000000
r700000003
r800000000
r900000000
r1000000000
r1100000000
r1200000000

swi

SWI _immed_8 WI 指令导致 SWI 异常。这意味着处理器状态更改为 ARM,处理器模式更改为 Supervisor,CPSR 保存到 Supervisor 模式 SPSR,并且执行分支到 SWI 向量。

add

The ADD instruction performs addition on two operands and stores the result in a destination register. It has several variations depending on the operand types:

_`immed_8`_ is ignored by the processor. However, it is present in bits[7:0] of the instruction opcode. It can be retrieved by the exception handler to determine what service is being requested.
_`immed_8`_ 被处理器忽略。然而,它存在于指令操作码的位[7:0]中。异常处理程序可以检索它以确定正在请求什么服务。

ADD r3, r1, r2 把r1和r2加在一起放在r3中

.global _start
.section .text
_start:
	mov r0, #2
	mov r1, #3
	mov r2, #4
	ADD r3, r1, r2
	ADD r4, r3, #5
	SUB r5, r4, r3
	MUL r6, r1, r2
	MSR CPSR, r6
	swi 11
	mov r7, #1

LDR \ STR

下面是 LDR和 STR

.global _start
.section .text
_start:
    .data
    var1: .word 5
    var2: .word 6 
    mov r0, #2
    mov r1, #3
    mov r2, #4
    ADD r3, r1, r2 
    ADD r4, r3, #5 
    SUB r5, r4, r3
    MUL r6, r1, r2 
    mov r7, #1
    mov r8, #1

    STR r3, var1  
    STR r6, var2 


    LDR r7, var2 
    LDR r8, var1


    MSR CPSR, r6
    swi 11


    mov r7, #1
  • STR (Store Register):STR <register>, <memory_address> 将寄存器中的值存储到内存中。
  • LDR (Load Register)**:LDR <register>, <memory_address>将内存中的值加载到寄存器中。

logical operators

AND ORR EOR MVN

.global _start
.section .text
_start:

  ; Prepare some values in registers
  mov r0, #0x0A     ; r0 = 0x0A (1010 in binary)
  mov r1, #0x0F     ; r1 = 0x0F (1111 in binary)

  ; AND operation (r2 stores the bitwise AND of r0 and r1)
  AND r2, r0, r1
  
  ; ORR operation (r3 stores the bitwise OR of r0 and r1)
  ORR r3, r0, r1
  
  ; EOR operation (r4 stores the bitwise exclusive OR of r0 and r1)
  EOR r4, r0, r1

  ; MVN operation (r5 stores the bitwise NOT of r1)
  MVN r5, r1


  ; Exit the program
  mov r7, #0
  swi 0

在 ARMv7 架构中,ANDORREORMVN 是用于进行位级运算的基本指令。它们分别用于执行以下操作:

1. AND (Bitwise AND,按位与):

  • 将两个寄存器中的值进行按位与运算,并将结果存储在指定的寄存器中。
  • 只有当两个操作数的对应位都为 1 时,结果位才为 1。
  • 用途:
    • 检查两个值是否存在共同的位模式。
    • 提取特定位组合。
    • 实现掩码操作。

2. ORR (Bitwise OR,按位或):

  • 将两个寄存器中的值进行按位或运算,并将结果存储在指定的寄存器中。
  • 只要两个操作数中的任何一个对应位为 1,结果位就为 1。
  • 用途:
    • 组合多个位模式。
    • 设置特定位。
    • 实现逻辑“或”操作。

3. EOR (Bitwise exclusive-OR,按位异或):

  • 将两个寄存器中的值进行按位异或运算,并将结果存储在指定的寄存器中。
  • 只有当两个操作数的对应位不同时,结果位才为 1。
  • 用途:
    • 比较两个值是否相同。
    • 加密/解密数据。
    • 实现逻辑“异或”操作。

4. MVN (Bitwise NOT,按位非):

  • 对一个寄存器中的值进行按位非运算,并将结果存储在指定的寄存器中。
  • 将每个位反转(1 变为 0,0 变为 1)。
  • 用途:
    • 生成补码。
    • 实现逻辑“非”操作。
    • 反转位模式。

示例:

Code snippet

mov r0, #0x0A     ; r0 = 0x0A (1010 in binary)
mov r1, #0x0F     ; r1 = 0x0F (1111 in binary)

AND r2, r0, r1   ; r2 = 0x0A (1010 AND 1111 = 1010)
ORR r3, r0, r1   ; r3 = 0x0F (1010 OR 1111 = 1111)
EOR r4, r0, r1   ; r4 = 0x05 (1010 XOR 1111 = 0101)
MVN r5, r1       ; r5 = 0xF0 (NOT 1111 = 0000 inverted to 1111)

注意:

  • 这些指令通常用于对寄存器中的值进行操作,也可以用于内存地址指向的值。
  • ANDORREOR 可以用于比较两个值是否相等,例如 CMP r0, r1 NEQ #0 (如果 r0 不等于 r1,则触发异常)。
  • MVN 可以用于生成补码,例如 ADD r2, r0, MVN r1 (将 r0 加上 r1 的补码,得到 r0 的负数)。

总结:

ANDORREORMVN 是 ARMv7 中重要的位级运算指令,用于执行各种逻辑操作、数据处理和比较任务。它们是汇编编程中不可或缺的工具,在各种应用场景中都有广泛应用。

loop

.global _start
.section .text
_start:

    ; Initialize loop counter
    mov r0, #0

    ; Loop condition check
loop_start:
        cmp r0, #10  ; Check if loop counter has reached 10
        bge loop_end  ; If counter >= 10, exit loop

    ; Loop body
        ; Perform loop iterations here
        add r0, r0, #1  ; Increment loop counter

        ; Print current loop iteration (replace with your actual printing mechanism)
        ; Printf("Iteration: %d\n", r0)

        ; Jump back to loop condition check
        b loop_start

loop_end:
    ; Loop exit
    mov r7, #0
    swi 0

; Exit the program

register breakpoint

#flashcards/ComputerScience

if register have 12,so 7 register can breakpoint ? if register have 12,so 7 register can breakpoint

<!--SR:!2024-11-25,103,250-->

register 位数

register 16进制,每个值都是4位数

arm中还有其他寄存器

  • SP:stack pointer 堆栈指针:堆栈上的下一个可用位置,如果通用寄存器没有足够空间,
  • lr
  • PC:程序计数器,每次执行一次+1
  • cpsr
  • spsr