首页 > 解决方案 > 为什么在下面的汇编代码中 sys_write 会打印两次?

问题描述

下面的代码是将内存中的两个数字相加,在数据段中定义,但结果在内存中没有特定值。因此,在 sum 过程结束时,代码首先调用 sys_write 来打印消息,然后再次使用 sys_write 打印结果。但在终端我得到了这个:

La suma es
1234567890
1098765432
2333333322
2333333322
�U

代码是:

section .data
   sum_msg: db "La suma es", 10
   num1:  db "1234567890",10
   num2:  db "1098765432",10
   sum:   db "          ", 10
   lenmsg: equ $-sum_msg
   lensum: equ $-num1

section .text
global _start
_start:

mov esi, 9
mov ecx, 10
clc
add_loop:
    mov al, [num1+esi]
    adc al, [num2+esi]
    aaa
    pushf
    or al, 30h
    popf
    mov [sum+esi], al
    dec esi
    loop add_loop


mov ecx, sum_msg
    mov edx, lenmsg
    mov ebx, 1
    mov eax, 4
    int 0x80     ; call kernel



    mov ecx, sum
    mov edx, lensum
    mov ebx, 1
    mov eax, 4
    int 0x80     ; call kernel


    mov eax, 1
    int 0x80

谢谢,我希望有人能帮助我理解为什么会这样。

标签: assemblyx86nasm

解决方案


小丑是正确的。详细地说,$ 是当前位置。您声明 lenmsg 和 lensum 的方式相当于:

lenmsg:等于 lenmsg-sum_msg

lensum: equ lensum-num1

我本来希望第二个 sys_write 从 num1 打印到 sum 的末尾加上 lenmsg 解释为字符(即您提供的输出的最后一行。)


推荐阅读