【问题标题】:Assembly checking the largest in three numbers装配检查三个数中最大的一个
【发布时间】:2022-12-02 21:40:32
【问题描述】:

我现在正在学习汇编,我有一个非常大的问题要解决。 (顺便说一句,我使用 x86_64 nasm 程序集)

到目前为止,我已经做到了

section .bss
    result: resb 10
section .data
    num1: db '22'
    num2: db '33'
    num3: db '44'

section .text
    global _start
_start:
    mov cl, [num1]
    cmp cl, [num2]
    jg _check_third_num
    mov cl, [num2]

_check_third_num:
    cmp cl, [num3]
    jg _exit
    mov cl, [num3]
_exit: 
    mov [result], rcx
    mov rax, 1
    mov rdi, 1
    mov rsi, result
    mov rdx, 10

    syscall
    mov rax, 60
    mov rdi, 0

    syscall

我想它按我预期的那样工作,但输出不正确。

所以,我基本上是这样编译的

     $ nasm -f elf64 hello.asm -o hello.o
     $ ld -o hello hello.o
     $ ./hello

我得到这个输出4,而不是我希望的44

那你能帮我吗?

【问题讨论】:

  • 比较逻辑是否有缺陷,或者只是输出?
  • 你的数字是字符串,所以你的比较已经是错误的,因为它只比较第一个数字,这是你将在最后打印的数字,因为这是你加载到 cl 中的唯一内容。
  • 即使我将其更改为数字,它也无法按我预期的那样运行
  • 你需要相比作为二进制数读入变量/寄存器但是输出作为十进制数字字符串。
  • 所以最好丢弃所有不相关的代码部分并调整标题。

标签: assembly x86-64 nasm


【解决方案1】:

很抱歉提出愚蠢的问题,但是......

我想我只需要做更多的工作,但感谢您帮助我们解决我的问题。

所以,我参加了印度教程(个人感觉很糟糕)。他们说我们可以比较字符串来代替数字。但是,可以肯定的是,这不能正常工作。

我会投反对票,这样我就不会再犯一些愚蠢的错误了。

此外,我将获得 <10 个数字的工作。对于超过 10 个数字,我想我很快就会得到它。

section .bss
    result: resb 2
section .data
    num1: db 9
    num2: db 8
    num3: db 7

section .text
    global _start
_start:
    mov cl, [num1]
    cmp cl, [num2]
    jg _check_third_num
    mov cl, [num2]

_check_third_num:
    cmp cl, [num3]
    jg _exit
    mov cl, [num3]
_exit: 
    add rcx, '0'
    mov [result], rcx
    mov rax, 1
    mov rdi, 1
    mov rsi, result
    mov rdx, 2

    syscall
    mov rax, 60
    mov rdi, 0

    syscall

【讨论】:

  • 您可以将固定长度的 4 字节字符串与双字整数进行比较,但您必须首先 bswap,以便前导字节(打印顺序中最重要的字节)交换到整数值中最重要的位置。这也不完全正确;您将 8 个字节存储到 result,但您只为 2 个保留了空间。您在 RDX 中传递了 length = 2,但第 2 个字节是二进制 0(假设您静态链接它并在普通 Linux 内核上运行,否则它是垃圾因为你只是将一个新的 CL 合并到 RCX 中,而不是 movzx ecx, byte [num1]。)
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 2020-07-16
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多