当前位置: 首页 > 知识库问答 >
问题:

在macos x86_64的汇编中向后打印整数

梁丘经艺
2023-03-14

我正在尝试在macOS上的汇编x86_64中打印整数。我已经知道大约有3/4的答案,但我无法解决我的问题。

现在,我会满意地把它倒着印出来。这是代码:

section .bss                                                            
  3 number_back                 resb                3                       
  4 number_right                resb                3                       
  5                                                                         
  6 section .text                                                           
  7     global _main                                                        
  8 _main:                                                                  
  9     mov rax, 123                                                        
 10     call _get_backwards                                                 
 11                                                                         
 12     mov rax, 0x2000004                                                  
 13     mov rdi, 1                                                          
 14     mov rsi, number_back                                                
 15     mov rdx, 3                                                          
 16     syscall                                                             
 17                                                                         
 18     mov rax, 0x2000001                                                  
 19     xor rdi, rdi                                                        
 20     syscall                                                             
 21                                                                         
 22 _get_backwards:                                                         
 23     xor rdx, rdx                                                        
 24     mov rcx, 10                                                         
 25     div rcx                                                             
 26     add rdx, 48                                                         
 27     mov [rel number_back], rdx                                          
 28                                                                         
 29 loop:                                                                   
 30     inc number_back                                                     
 31     cmp rax, 0                                                          
 32     jne _get_backwards                                                  
 33     ret                     

  1. mov rax,123;将数字移动到rax寄存器中
  2. 调用get_backwards过程
  3. 除法和mult需要两个寄存器,一个用于商,一个为余数。对剩余部分进行异或运算,以便清除所有垃圾。
  4. mov转换为rcx,10,这样我就可以得到与数字的最后一位相对应的余数,在本例中为3。
  5. 将rax除以rcx
  6. 获取整数的ascii码。
  7. 将rdx寄存器的内容移动到由指针number_back保持的内存地址中。
  8. 这是导致问题的部分。我想做一些事情,比如number_back[0]=3,number_back[1]=2……我认为将指针增加1会带来麻烦,但我不正确。我得到了这个错误
error: invalid combination of opcode and operands

提前感谢。

共有1个答案

卢宜然
2023-03-14

您不能递增标签,因为它没有存储在内存中的任何位置,只是一个命名的别名,它将被您分配的内存的地址替换。这样做的方法是有一个额外的寄存器(RBX现在是免费的)来存储您需要添加到地址中的偏移量。代码的另一个问题是,您将在向后数中存储值的(十)基数表示形式为word,这将超过您的容量。我猜您正在尝试以“正常”的左到右方式打印您的数字。如果你想这样做,你应该做的是保留更多的空间(3bytes=

section .bss                                                            
 number_back                 resb                8; 8 characters                       
 number_right                resb                3   
section .text
    global _main
    _main:
     mov rax, 123 
     mov rbx, 0                                                       
     call _get_backwards                                                 
                                                                         
     mov rax, 0x2000004                                                  
     mov rdi, 1                                                          
     mov rsi, number_back                                                
     mov rdx, 3                                                          
     syscall                                                             
                                                                         
     mov rax, 0x2000001                                                  
     xor rdi, rdi                                                        
     syscall                                                             
                                                                         
 _get_backwards:                                                         
     xor rdx, rdx                                                        
     mov rcx, 10                                                         
     div rcx                                                             
     add rdx, 48                                                         
     mov [rel number_back + rbx], rdx                                          
                                                                         
 loop:                                                                   
     inc rbx                                                    
     cmp rax, 0                                                          
     jne _get_backwards                                                  
     ret     

应该可以工作(对不起,我这台计算机上没有nami编译器)。

 类似资料:
  • 问题内容: 我有以下代码可以打印传递给的参数数量。请注意该部分中的。我已经包括了新行,就像 C中一样 ,但是它不是打印新行而是打印: 参数数量:1 \ n 我的代码是: 我知道在0和“ Number …”之后包含10 将打印它,但我想这样做。我用 NASM 汇编代码,然后通过 GCC 将其链接以创建我的可执行文件。 问题答案: 当您在 NASM中 对字符串使用双引号或双引号时,它不接受 C 样式转

  • 问题内容: 我正在尝试编写一个小程序,该程序在数组中打印出不同的数字。例如,如果用户输入1,1,3,5,7,4,3,则该程序将仅打印出1,3,5,7,4。 我在else if函数中遇到错误。 到目前为止,这是我的代码: 问题答案: 首先,“ ”语句是不正确的,因为您没有为if提供任何条件(如果需要if,则需要编写“ ”)。 其次,您不能 在内部 循环中决定是否应打印一个值:代码的工作方式是 为每个

  • 在这个链接中,rustyx提到他使用了一个调试虚拟机和以下标志来获取java字节码的汇编指令 我用sudo apt get install openjdk-17-dbg安装了调试虚拟机 我使用命令java-XX:UnlockDiagnosticVMOptions-XX:PrintAssembly Main 我习惯用C和gdb来完成这项工作,但无法用java来完成。printAssembly只打印指

  • 问题内容: 我想读取捕获的异常的完整堆栈跟踪。 例如: 我想阅读“ … 23更多”,以了解异常的来源。 问题答案: 答案很简单,这些行已经在stacktrace中了:) 基本上,以下情况正在发生:

  • 本文向大家介绍汇编语言实现打印杨辉三角,包括了汇编语言实现打印杨辉三角的使用技巧和注意事项,需要的朋友参考一下 计算杨辉三角形的前n(n<=10)行,并显示在屏幕上。要求计算及显示 用子程序形式实现。其显示格式为: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 如何使用GCC在C99中打印f和? 我搜索了其他建议使用的帖子,但它给出了以下警告: 警告#1:格式为[-Wformat]| 的未知转换类型字符“l”#警告#2:格式为[-Wformat extra args]的参数太多| 进行以下尝试: