Как я могу написать adler32 в asm (64-разрядная версия Linux Linux)? - PullRequest
0 голосов
/ 12 сентября 2018

Я пробовал много раз, но у меня проблема с использованием деления, помогите мне, пожалуйста.Вот мой код:

    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
...