Я пробовал много раз, но у меня проблема с использованием деления, помогите мне, пожалуйста.Вот мой код:
segment .bss
s resb 8
segment .data
fp db "/usr/share/diet/words"
segment .text
global main
global adler32
extern printf
extern stdlib
extern fopen
extern fgets
; long adler32(char *data, int len)
adler32:
.data equ 0
.len equ 8
.i equ 16
push rbp
mov rbp,rsp
sub rsp,32
mov [rsp+.data],rdi
mov [rsp+.len],rsi
xor rcx,rcx
mov [rsp+.i],rcx
segment .data
.a dq 1
.b dq 0
.const dd 65521
segment .text
.loop
mov rcx,[rsp+.i]
cmp rcx,[rsp+.len]
je .end
;for ( i = 0 ; i < len ; i++ ) {
; a = (a + data [i] ) % 65521 ;
; b = (b + a) % 65521 ;
;}
;return (b <<16) | a
mov rdi,[rsp+.data] ; rdi = (data)
add rdi,rcx ; rdi = (data+i)
mov rdi,[rdi] ; rdi = *(data +i)
add rdi,0 ; convert char to number
mov rax,[.a] ; save a
add rax,rdi ; a = a+data[i]
xor rdx,rdx
idiv [.const] ; a = a%65521,
mov [.a],rdx ; save a
mov rax,[.b] ; save b
add rax,rdx ; b = b + a
xor rdx,rdx
idiv [.const] ; b = b%65521,
mov [.b],rdx ; save b
inc rcx
mov [rsp+.i],rcx
jmp .loop
.end
mov rax,[.b]
shl rax,16
mov rdx,[.a]
or rax,rdx
leave
ret
main:
push rbp
mov rbp,rsp
; file *fp = fopen(char *file_name,char mode)
lea rdi,[fp]
mov rsi,'r'
call fopen
; char *fgets(char *s,int size,FILE *fp)
mov rdi,s
mov rsi,16
mov rdx,rax
call fgets
mov rdi,rax
mov rsi,16
call adler32
leave
ret