LAOXU 发表于 2023-12-14 03:33:24

〖51经典汇编,功能模块欣赏〗1~4字节内容左对齐,不影响任何其他资源

本帖最后由 LAOXU 于 2023-12-14 03:48 编辑

R4~R7寄存器,保存1~4字节右对齐内容,现将其移至左对齐。


入口条件: R2 (保存flags域,应用于 51可重入 printf函数),

出口:将 R4~R7寄存器内容左移后,末位填0, 不改变 ACC内容
                        
执行如下汇编代码:

#define LEFT                   0x04               //'-'对指定的域宽度 左对齐输出
sbit          bitLEFT   =      ACC.2
#define PLUS                   0x08                   //'+'如果输出是一个带符号类型,用+/-符号为输出
sbit          bitPLUS   =      ACC.3
#define SPACE                  0x10                   //' '输出值的前缀是空格(为0时), 否则, 前缀加 0 (为1时),
sbit          bitSPACE=      ACC.4
#define SPECIAL                0x20                  //'#'当用 o, x 和 X 域类型时,对非零输出值分别用 0, 0x, 或 0X 为前缀
sbit          bitSPECIAL=      ACC.5                //   当用 e, E, f, g, 和 G 域类型时, '#'标记强迫输出值包含一个小数点
#define DOT                  0x40                  //'.'小数点   
sbit          bitDOT    =      ACC.6
#define CHAR_B                0x01                  //数据类型 char   
sbit          bitCHAR_B =      ACC.0   
#define LONG_L                0x02                  //数据类型 long      
sbit          bitLONG_L =      ACC.1   
#define POSNEG                0x80                  //有符号数 0: '+'号, 1: '-'号
sbit          bitPOSNEG =      ACC.7   

LONG_RRN:      XCH          A,R2
                        JB            bitLONG_L,SWAP_L         //数据类型 long
                        JNB            bitCHAR_B,SWAP_I          //数据类型 char   
                        LCALL      LONG_RR
SWAP_I:            LCALL      LONG_RR
                        LCALL      LONG_RR
SWAP_L:            XCH          A,R2
                        RET

LONG_RR:         XCH          A,R4
                        XCH          A,R5
                        XCH          A,R6
                        XCH          A,R7
                        CLR         A
                        XCH          A,R4
                        RET

pangshijz 发表于 2023-12-14 08:33:31

学习了
页: [1]
查看完整版本: 〖51经典汇编,功能模块欣赏〗1~4字节内容左对齐,不影响任何其他资源