汇编中三个数字的平均值

时间:2018-10-03 20:13:17

标签: assembly nasm x86-64

有人可以帮我编写一个程序来计算汇编中3个数字(NASM 64位)的平均值吗?

我尝试过的事情:

section .data
    num1 db 3
    num2 db 4
    num3 db 5
    divisor db 3
    digit db 0, 10

section .text
    global _start
    _start:
        mov rax, num1
        mov rax, num2
        div rax, num3
        mov rbx, divisor
        div rbx
        mov rax, 60
        mov rdi, 0
        syscall
    _printRAX:
        add rax, 48
        mov [digit], al
        mov rax, 1
        mov rdi, 1
        mov rsi, digit
        mov rdx, 2
        syscall
        ret

1 个答案:

答案 0 :(得分:1)

好的,这有两个例子可能会有所帮助:

示例1:

;
; Standalone NASM "Hello world"
;
; BUILD:
; nasm -f elf64 hello.asm
; ld -s -o hello hello.o
;
; EXAMPLE OUTPUT:
; Hello, world!
;
section .text                   ;code section (shareable between processes)
    global  _start              ;loader entry point

_start:
    mov     edx,len             ;arg3: msg len
    mov     ecx,msg             ;arg2: *msg
    mov     ebx,1               ;arg1: 1 (stdout)
    mov     eax,4               ;syscall@4 (sys_write)
    int     0x80

    mov     ebx,0               ;arg1: exit code (0)
    mov     eax,1               ;sycall@1 (sys_exit)
    int     0x80

section .data                   ;data section (per process)
msg db      "Hello, world!",0xa ;our dear string
len equ     $ - msg             ;length of our dear string

示例2:

;
; "Hello world" using standard C library
;
; BUILD:
; nasm -f elf64 avg3.asm
; gcc -m64 -o avg avg.o
;
; EXAMPLE OUTPUT:
; sum=12
; avg=4
;
extern  printf                  ;stdlib C function

section .text                   ;code section
    global  main                ;standard GCC entry point

main:
    push rbp                    ;set up stack frame: must be aligned

    ; Add 3+4+5
    mov     rax,3
    add     ax,4
    add     ax,5

    ; Save and print sum
    push    rax
    mov     rdi,fmt1            ;printf format string
    mov     rsi,rax             ;1st parameter
    mov     rdx,0               ;No 2nd parameter
    mov     rax,0               ;No xmm registers
    call    printf

    ; Compute and print average
    mov     dx,0                ;Clear dividend, high
    pop     rax                 ;dividend, low <= sum
    mov     cx,3                ;divisor
    div     cx                  ;ax= high, dx= low

    ; Print average
    mov     rdi,fmt2            ;printf format string
    mov     rsi,rax             ;1st parameter
    mov     rdx,0               ;No 2nd parameter
    mov     rax,0               ;No xmm registers
    call    printf

    ; Exit program
    pop rbp
    mov rax,0
    ret

section .data                   ;data section
fmt1:
    db      "sum=%d",0xa,0
fmt2:
    db      "avg=%d",0xa,0

注意:

  • 我个人更喜欢“ Gnu汇编程序”(gas)。它使您可以轻松地在不同体系结构之间以及在C和内联汇编程序之间进行切换,而无需处理Intel语法的“认知失调”;)

  • 我强烈建议您尽可能利用标准C库。实际上,这意味着使用gcc而不是ld链接可执行文件。

    您的“计算平均值”程序是一个很好的例子,为什么:让printf格式化程序找出正确的输出要容易得多,而不是将二进制值转换为ASCII数字,然后弄清楚如何将其格式化为字符串手动。

'希望有帮助!