有人可以帮我编写一个程序来计算汇编中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
答案 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数字,然后弄清楚如何将其格式化为字符串手动。
'希望有帮助!