📄 sendbits.s
字号:
;===========================================================================; Copyright (c) 1990-1999 Info-ZIP. All rights reserved.;; See the accompanying file LICENSE, version 1999-Oct-05 or later; (the contents of which are also included in zip.h) for terms of use.; If, for some reason, both of these files are missing, the Info-ZIP license; also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html;===========================================================================; sendbits.s for ARM by Sergio Monesi and Darren Salt.r0 RN 0r1 RN 1r2 RN 2r3 RN 3r4 RN 4r5 RN 5r6 RN 6r7 RN 7r8 RN 8r9 RN 9sl RN 10fp RN 11ip RN 12sp RN 13lr RN 14pc RN 15 AREA |Asm$$Code|, CODE, READONLY = "send_bits",0 ALIGN & &FF00000C IMPORT __rt_stkovf_split_small IMPORT flush_outbuf IMPORT bi_valid IMPORT bi_buf IMPORT out_size IMPORT out_offset IMPORT out_buf EXPORT send_bitssend_bits MOV ip,sp STMDB sp!,{r4,r5,fp,ip,lr,pc} SUB fp,ip,#4 LDR r5,=bi_buf LDR r3,=bi_valid LDR r4,[r5] LDR r2,[r3] ORR r4,r4,r0,LSL r2 ; |= value<<bi_valid ADD r2,r2,r1 ; += length CMP r2,#&10 STRLE r2,[r3] ; short? store & return STRLE r4,[r5] LDMLEDB fp,{r4,r5,fp,sp,pc}^ SUB r2,r2,#&10 ; adjust bi_valid, bi_buf MOV ip,r4,LSR #16 ; (done early, keeping the old bi_buf STR r2,[r3] ; in R4 for later storage) STR ip,[r5] LDR r0,=out_size LDR r1,=out_offset LDR r0,[r0] LDR r2,[r1] SUB r0,r0,#1 CMP r2,r0 ; if out_offset >= out_size-1 LDRHS r0,=out_buf LDRHS r0,[r0] BLHS flush_outbuf ; then flush the buffer LDR r0,=out_buf LDR r1,=out_offset LDR r0,[r0] LDR r2,[r1] MOV r5,r4,LSR #8 STRB r4,[r0,r2]! ; store 'old' bi_buf STRB r5,[r0,#1] ADD r2,r2,#2 STR r2,[r1] LDMDB fp,{r4,r5,fp,sp,pc}^ptr_bi & bi_valid & bi_buf = "bi_reverse",0 ALIGN & &FF00000C EXPORT bi_reversebi_reverse MOV r2,#0loop MOVS r0,r0,LSR #1 ADCS r2,r2,r2 SUBS r1,r1,#1 BNE loop MOV r0,r2 MOVS pc,lr END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -