帝企鹅的日记 发表于 2018-6-19 22:48:12

如何实现数组数据在屏幕以左对齐显示?求助

本帖最后由 帝企鹅的日记 于 2018-6-19 22:57 编辑

例如:
...
name db 'dfhw',‘$','oewirut','$'
score db 15,24
...
显示结果为
dfhm             15
oewirut          24
求助,感谢!
就像c语言中的/t功能

人造人 发表于 2018-6-19 23:38:40

C语言中的 '\t' 并不好用
^_^

偷个懒,有 3 个函数用C语言写了
如果你觉得不爽,可以把这 3 个函数翻译成汇编语言
^_^


之前贴过类似的代码,不过那个排版有 bug
这个应该也有,试一试吧
下面是代码

assume cs:code, ds:data, ss:stack

; void far Align(char *buf, const char *str, int len)
extrn _Align:far
; void far NumberToString(char *buf, int num)
extrn _NumberToString:far

stack segment
        db 1024 dup(?)
stack ends

data segment
buf        db 1024 dup(?)
str1        db 'dfhm', 0
str2        db 'oewirut', 0

score        db 15, 24
       
data ends

code segment
start:
        mov        ax, stack
        mov        ss, ax
        mov        sp, 1024
        mov        ax, data
        mov        ds, ax
       
        mov        ax, 12
        push        ax
        mov        ax, offset str1
        push        ax
        mov        ax, offset buf
        push        ax
        call        _Align
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        xor        ax, ax
        mov        bx, offset score
        mov        al,
        push        ax
        mov        ax, offset buf
        push        ax
        call        _NumberToString
        add        sp, 4
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        ; 换一行
        mov        bx, offset buf
        mov        al, 0dh
        mov        , al
        mov        al, 0ah
        mov        , al
        mov        al, '

下面这个C语言代码需要用tc编译
static void Swap(char *a, char *b)
{
        char ch = *a;
        *a = *b;
        *b = ch;
}

void far NumberToString(char *buf, int num)
{
        int i = 0;
        int j = 0;
       
        while(num)
        {
                int rem = num % 10;
                num /= 10;
                buf = rem + '0';
        }
        buf = '




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
       
        mov        ax, 12
        push        ax
        mov        ax, offset str2
        push        ax
        mov        ax, offset buf
        push        ax
        call        _Align
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        xor        ax, ax
        mov        bx, offset score
        mov        al,
        push        ax
        mov        ax, offset buf
        push        ax
        call        _NumberToString
        add        sp, 4
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        ; 换一行
        mov        bx, offset buf
        mov        al, 0dh
        mov        , al
        mov        al, 0ah
        mov        , al
        mov        al, '

下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
        mov        ax, 4c00h
        int        21h
code ends
end start


下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]



;                /* dos 中使用 '




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
       
        mov        ax, 12
        push        ax
        mov        ax, offset str2
        push        ax
        mov        ax, offset buf
        push        ax
        call        _Align
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        xor        ax, ax
        mov        bx, offset score
        mov        al,
        push        ax
        mov        ax, offset buf
        push        ax
        call        _NumberToString
        add        sp, 4
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        ; 换一行
        mov        bx, offset buf
        mov        al, 0dh
        mov        , al
        mov        al, 0ah
        mov        , al
        mov        al, '

下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
        mov        ax, 4c00h
        int        21h
code ends
end start


下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]



表示字符串结束 */
       
        --i;
       
        while(j <= i)
        {
                Swap(&buf, &buf);
                ++j;
                --i;
        }
}

void far Align(char *buf, const char *str, int len)
{
        int i = 0;
       
        while(str)
        {
                buf = str;
                ++i;
        }
       
        while(i <= len)
        {
                buf = ' ';
                ++i;
        }
       
        buf = '




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
       
        mov        ax, 12
        push        ax
        mov        ax, offset str2
        push        ax
        mov        ax, offset buf
        push        ax
        call        _Align
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        xor        ax, ax
        mov        bx, offset score
        mov        al,
        push        ax
        mov        ax, offset buf
        push        ax
        call        _NumberToString
        add        sp, 4
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        ; 换一行
        mov        bx, offset buf
        mov        al, 0dh
        mov        , al
        mov        al, 0ah
        mov        , al
        mov        al, '

下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
        mov        ax, 4c00h
        int        21h
code ends
end start


下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]



;                /* dos 中使用 '




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
       
        mov        ax, 12
        push        ax
        mov        ax, offset str2
        push        ax
        mov        ax, offset buf
        push        ax
        call        _Align
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        xor        ax, ax
        mov        bx, offset score
        mov        al,
        push        ax
        mov        ax, offset buf
        push        ax
        call        _NumberToString
        add        sp, 4
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        ; 换一行
        mov        bx, offset buf
        mov        al, 0dh
        mov        , al
        mov        al, 0ah
        mov        , al
        mov        al, '

下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
        mov        ax, 4c00h
        int        21h
code ends
end start


下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]



表示字符串结束 */
}





        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
       
        mov        ax, 12
        push        ax
        mov        ax, offset str2
        push        ax
        mov        ax, offset buf
        push        ax
        call        _Align
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        xor        ax, ax
        mov        bx, offset score
        mov        al,
        push        ax
        mov        ax, offset buf
        push        ax
        call        _NumberToString
        add        sp, 4
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
        ; 换一行
        mov        bx, offset buf
        mov        al, 0dh
        mov        , al
        mov        al, 0ah
        mov        , al
        mov        al, '

下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]




        mov        , al
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, offset buf
        int        21h
       
       
        mov        ax, 4c00h
        int        21h
code ends
end start


下面这个C语言代码需要用tc编译
[        DISCUZ_CODE_1        ]



人造人 发表于 2018-6-19 23:40:14

果然有 bug
不要看上面的了
直接看 Res.zip 的内容就好

帝企鹅的日记 发表于 2018-6-20 19:31:35

人造人 发表于 2018-6-19 23:40
果然有 bug
不要看上面的了
直接看 Res.zip 的内容就好

谢谢

57158597@qq.com 发表于 2018-6-22 09:52:01

本帖最后由 57158597@qq.com 于 2018-6-22 09:58 编辑

;在汇编里没有什么对齐格式的,字符串按什么对齐都要自己写,下面的代码就是个字符串的对齐格式,修改列的位置可以实现各种对齐

assume cs:code

datasegment
db 'dfhw',0,'oewirut',0,0
data ends

code segment
start:    mov ax,data
         mov ds,ax
         mov si,0
         call site
         mov ax,0B800h   ;显卡内存地址,DOS下显卡内存地址显示区为25行80列
         mov es,ax
         mov bp,0
         mov ax,0      
   s1:mov al,ds:    ;送字符串字节
         cmp al,0          ;判断是否结束位
         jes2      
         mov es:,al
           add si,2
         inc bp         
         jmp s1
                  
   site:mov bx,1600      ;行偏移地址bx,1600是第11行,(第1行0*160,第2行1*160...第25行24*160)                  
         mov si,0               ;列偏移地址si(第1列0*2,第2列1*2...第80列79*2)修改列的位置就能实现对齐,左对齐是0列,居中是2*39=78列
         mov di,si             ;列的初始位置保存在di   
         ret
                  
   s2:inc bp            
         mov al,ds:   
         cmp al,0         
         jeexit
         add bx,160         ;换行
           mov si,di         ;初始化列的位置
         jmp s1                  

   exit:mov ax,4c00h
         int 21h                  
         
code ends
end start
页: [1]
查看完整版本: 如何实现数组数据在屏幕以左对齐显示?求助