ARMv8:十进制转换使用ARMv8汇编语言二进制

问题描述 投票:-1回答:2

如何转换十进制使用ArmV8汇编语言实施例至二值:输入:43输出:101011

我主要是不知道如何从十进制做转换部分二进制

或如何将它从任何编程语言ARMv8翻译

这就是我

ARMv8汇编语言代码

.data

decimal: .asciz "%s"

binary: .asciz "%d"

   newline:       .asciz "\n"

   string_input_buffer: .space 256

   userPrompt: .asciz "Input an integer: \n"

.text

.global main

main:

   # Load the input prompt and print it out

   ldr x0, =userPrompt

   bl printf

   # Take in the input and save it in the buffer

   ldr x0, =decimal

   ldr x1, =string_input_buffer

   bl scanf

   bl decToBin

done:

   mov x0, #0

   mov x8,#93

   svc #0

decToBin:

// Convert Decimal to Binary

这是我在Java代码

while(decimal != 0)
        {
            a = decimal%2;

            b += a* Math.pow(10, count);

            count++;

            decimal = decimal/2;

        }

我似乎无法理解如何翻译它来武装

assembly arm arm64 armv8
2个回答
1
投票

既然你正在编写大会我假设你已经知道该号码已经被存储在存储器中,并以二进制格式的寄存器和每个操作操纵它,是一个二进制的操作为好。

你有什么java代码呢,创造其无符号二进制表示,这当然具有不同的值完全相同的数字,其结果是不同的二进制表示本身的整数。我觉得很难想象,你可以做什么与此]除打印出来的整数,但在Java中已经有该内置功能:Print an integer in binary format in Java

事实上,这样的函数的第一个步骤是在顺序中的每个数字的转换成其相应的字符要被打印为这样。这是相同的过程这将遵循为您的构造整数,以及为了进行打印。因此,创建这样一个整数似乎是多余的给我。所以,问题是:“这就是你真正想做的事情?”


0
投票

如果你问的问题,因为你有一个分配新建分配FY,你的目标应该很可能已经花费需要建立你自己的,工作,解决尽可能多的时间:这是我的愚见是最好的学习方式..

这是很容易比组装,链接和使用qemu-system-aarch64aarch64-elf-asaarch64-elf-ldaarch64-elf-gdb调试由步骤的程序aarch64步骤。

这可以在Linux和Windows做 - 我在情况下使用的Windows环境。该工具链从here下载,并从qemu-system-aarch64 here

如果你不觉得与基地/基数转换够舒服,找一个教程在互联网上的第一,如this one。只有这样,你应该开始寻找解决你的问题的工作。

在它的“探索性工具”的documention ARM is providing是明确的最好的,恕我直言,当它的COMME解释aarch63指令集的细节。

你的问题可以分为两个部分:

  • 转换在ASCII一个字符串,即“43”,成其二进制表示,101011。
  • 转换101011二进制数到它的字符串表示,即,“101011”。

以下的例子不会对输入执行任何验证,它什么应该做正常:

/* ----------------------------------------------------
   * A minimalist section of code for converting a
   * zero-terminated string representating a decimal
   * number into a zero-terminated string representating
   * a binary number.
   * --------------------------------------------------*/ 
                    .title "dec2bin.s"
                    .arch armv8-a
                    .text
                    .section .text.startup,"ax"    
                    .globl Reset_Handler            
     Reset_Handler:  ldr x0, =decimalsz       // load address of decimalsz into x0.
                     mov x2, xzr              // use x2 for computing the binary value - initial value is zero.
    decascii2bin:    ldrb w1, [x0], #1        // load byte pointed by x0, then increment x0 by 1.
                     cbz  x1, bin2binascii    // if x1 does contain zero, we reached the end of the input buffer.
                     sub w1, w1, #'0'         // x1 does contain the ASCII value for character '4' or '3' - substracting ASCII value for '0'.
                     // we need to multiply the previous result by 10, then add the current digit:
                     add x3, xzr, x2, lsl #3  // x3 = 0 + x2 << 3, i.e.  8 * x2 
                     add x2, x3, x2, lsl #1   // x2 = x3 + x2 < 1, i.e. 8 * x2 + 2 * x2 = 10 *x2
                     add x2, x2, x1           // if we are processing '4', x2 = x2 (0) * 10 + 4 = 4. if we are processing '43, x2 = x2 (40) * 10 + 3 = 43.
                     bl  decascii2bin
     bin2binascii:                            // x2 does now contain 43.           
                     ldr x0, =binarysz        // load address of binarysz into x0.
                     add x0, x0, #64          // x0 points to the byte which would contain the zero-termination if 32 bits were to be displayed.
                     clz x1, x2               // retrieve the number of bits set to zero for the number contained in x2.
                     sub x0, x0, x1           // number 43 begins with 58 zero bits, therefore we will only display 64 - 58 = 6 bits.
                     strb wzr, [x0], #-1      // store zero at binarysz + 6.
                     movk x3, #'0'            // store '0' in x3.
     nextbit:        bfxil  x3, x2, #0, #1    // extract 1 from x2 starting from most significant bit 0, and insert at low end of x3, leaving other bits unchanged.
                     strb w3, [x0], #-1       // store '0' or '1' to the byte location pointed by x0, then decrement x0 by one.
                     lsr x2, x2, #1           // shift x2 to the right by one bit.
                     add x1, x1, #1           // increment number of leading zero bits + number of bits processed, 58 + 1 at first pass, up to 64.
                     cmp x1, #64              // we are done of 64 bits were leading zero bits or processed.
                     b.ne nextbit
    done:            b.al  done

                    .balign 16
                     // maximum possible value for un unsigned uint_64_t in decimal is:
                     // 18446744073709551615.               
    decimalsz:      .asciz "43"
                     // maximum possible value for un unsigned uint_64_t in binary is:
                     // 1111111111111111111111111111111111111111111111111111111111111111.
                     // we need at most 65 bytes for  64 digits and a \0.
    binarysz:       .asciz "0000000000000000000000000000000000000000000000000000000000000000"
                    .end

组装/连接的例子:

aarch64-elf-as -g -adhln -o dec2bin.o dec2bin.s  > dec2bin.lst
aarch64-elf-ld -gc-sections -g -e Reset_Handler -Ttext-segment=0x42000000 -Map=dec2bin.map -o dec2bin.elf dec2bin.o

启动QEMU:

qemu-system-aarch64  -m 256M -semihosting -machine virt,gic-version=2,secure=on,virtualization=on -S -gdb tcp::1234,ipv4 -monitor telnet:127.0.0.1:1235,server,nowait -cpu cortex-a53 -nographic -kernel dec2bin.elf

启动GDB(在其他Windows控制台/ Linux的shell):

aarch64-elf-gdb dec2bin.elf

GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-w64-mingw32 --target=aarch64-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from src\dec2bin\dec2bin.elf...done.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
Reset_Handler () at dec2bin.s:13
13                       ldr x0, =decimalsz              // load address of decimalsz into x0.

现在,可以通过步骤执行程序步骤,并检查寄存器和使用stepip/x {$x0, $x1, $x2, $x3}x/s binarysz命令的输出缓冲器。

在您将达到做:,你可以检查结果的时间,然后退出GDB:

35      done:           b.al  done
(gdb) p/x {$x0, $x1, $x2, $x3}
$9 = {0x42000062, 0x40, 0x0, 0x31}
(gdb) x/s binarysz
0x42000063 <binarysz>:  "101011"
(gdb) kill
Kill the program being debugged? (y or n) y
[Inferior 1 (Remote target) killed]
(gdb) quit
© www.soinside.com 2019 - 2024. All rights reserved.