鱼C论坛

 找回密码
 立即注册
查看: 3237|回复: 4

[已解决]如何实现数组数据在屏幕以左对齐显示?求助

[复制链接]
发表于 2018-6-19 22:48:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

例如:
...
name db 'dfhw',‘$','oewirut','$'
score db 15,24
...
显示结果为
dfhm             15
oewirut          24
求助,感谢!
就像c语言中的/t功能
最佳答案
2018-6-22 09:52:01
本帖最后由 57158597@qq.com 于 2018-6-22 09:58 编辑

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

assume cs:code

data  segment
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:[bp]    ;送字符串字节
           cmp al,0          ;判断是否结束位
           je  s2        
           mov es:[bx][si],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:[bp]     
           cmp al,0         
           je  exit
           add bx,160         ;换行
           mov si,di           ;初始化列的位置
           jmp s1                  

   exit:  mov ax,4c00h
           int 21h                  
           
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-19 23:38:40 | 显示全部楼层
C语言中的 '\t' 并不好用
^_^

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


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

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

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

  6. stack segment
  7.         db 1024 dup(?)
  8. stack ends

  9. data segment
  10. buf        db 1024 dup(?)
  11. str1        db 'dfhm', 0
  12. str2        db 'oewirut', 0

  13. score        db 15, 24
  14.        
  15. data ends

  16. code segment
  17. start:
  18.         mov        ax, stack
  19.         mov        ss, ax
  20.         mov        sp, 1024
  21.         mov        ax, data
  22.         mov        ds, ax
  23.        
  24.         mov        ax, 12
  25.         push        ax
  26.         mov        ax, offset str1
  27.         push        ax
  28.         mov        ax, offset buf
  29.         push        ax
  30.         call        _Align
  31.         add        sp, 6
  32.        
  33.         ; DS:DX=待输出字符的地址
  34.         mov        ah, 09h
  35.         mov        dx, offset buf
  36.         int        21h
  37.        
  38.         xor        ax, ax
  39.         mov        bx, offset score
  40.         mov        al, [bx]
  41.         push        ax
  42.         mov        ax, offset buf
  43.         push        ax
  44.         call        _NumberToString
  45.         add        sp, 4
  46.        
  47.         ; DS:DX=待输出字符的地址
  48.         mov        ah, 09h
  49.         mov        dx, offset buf
  50.         int        21h
  51.        
  52.         ; 换一行
  53.         mov        bx, offset buf
  54.         mov        al, 0dh
  55.         mov        [bx + 0], al
  56.         mov        al, 0ah
  57.         mov        [bx + 1], al
  58.         mov        al, '

  59. 下面这个C语言代码需要用tc编译
  60. [code]static void Swap(char *a, char *b)
  61. {
  62.         char ch = *a;
  63.         *a = *b;
  64.         *b = ch;
  65. }

  66. void far NumberToString(char *buf, int num)
  67. {
  68.         int i = 0;
  69.         int j = 0;
  70.        
  71.         while(num)
  72.         {
  73.                 int rem = num % 10;
  74.                 num /= 10;
  75.                 buf[i++] = rem + '0';
  76.         }
  77.         buf[i] = '

  78. 1.png
  79. Res.zip (13.35 KB, 下载次数: 1)

  80.         mov        [bx + 2], al
  81.         ; DS:DX=待输出字符的地址
  82.         mov        ah, 09h
  83.         mov        dx, offset buf
  84.         int        21h
  85.        
  86.        
  87.        
  88.         mov        ax, 12
  89.         push        ax
  90.         mov        ax, offset str2
  91.         push        ax
  92.         mov        ax, offset buf
  93.         push        ax
  94.         call        _Align
  95.         add        sp, 6
  96.        
  97.         ; DS:DX=待输出字符的地址
  98.         mov        ah, 09h
  99.         mov        dx, offset buf
  100.         int        21h
  101.        
  102.         xor        ax, ax
  103.         mov        bx, offset score
  104.         mov        al, [bx + 1]
  105.         push        ax
  106.         mov        ax, offset buf
  107.         push        ax
  108.         call        _NumberToString
  109.         add        sp, 4
  110.        
  111.         ; DS:DX=待输出字符的地址
  112.         mov        ah, 09h
  113.         mov        dx, offset buf
  114.         int        21h
  115.        
  116.         ; 换一行
  117.         mov        bx, offset buf
  118.         mov        al, 0dh
  119.         mov        [bx + 0], al
  120.         mov        al, 0ah
  121.         mov        [bx + 1], al
  122.         mov        al, '

  123. 下面这个C语言代码需要用tc编译





  124.         mov        [bx + 2], al
  125.         ; DS:DX=待输出字符的地址
  126.         mov        ah, 09h
  127.         mov        dx, offset buf
  128.         int        21h
  129.        
  130.        
  131.         mov        ax, 4c00h
  132.         int        21h
  133. code ends
  134. end start
复制代码


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




;                /* dos 中使用 '




        mov        [bx + 2], 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, [bx + 1]
        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        [bx + 0], al
        mov        al, 0ah
        mov        [bx + 1], al
        mov        al, '

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





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

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




表示字符串结束 */
       
        --i;
       
        while(j <= i)
        {
                Swap(&buf[j], &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        [bx + 2], 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, [bx + 1]
        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        [bx + 0], al
        mov        al, 0ah
        mov        [bx + 1], al
        mov        al, '

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





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

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




;                /* dos 中使用 '




        mov        [bx + 2], 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, [bx + 1]
        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        [bx + 0], al
        mov        al, 0ah
        mov        [bx + 1], al
        mov        al, '

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





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

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




表示字符串结束 */
}
[/code]




        mov        [bx + 2], 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, [bx + 1]
        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        [bx + 0], al
        mov        al, 0ah
        mov        [bx + 1], al
        mov        al, '

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





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

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




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-19 23:40:14 | 显示全部楼层
果然有 bug
不要看上面的了
直接看 Res.zip 的内容就好

Res.zip (13.35 KB, 下载次数: 2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-20 19:31:35 | 显示全部楼层
人造人 发表于 2018-6-19 23:40
果然有 bug
不要看上面的了
直接看 Res.zip 的内容就好

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-22 09:52:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 57158597@qq.com 于 2018-6-22 09:58 编辑

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

assume cs:code

data  segment
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:[bp]    ;送字符串字节
           cmp al,0          ;判断是否结束位
           je  s2        
           mov es:[bx][si],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:[bp]     
           cmp al,0         
           je  exit
           add bx,160         ;换行
           mov si,di           ;初始化列的位置
           jmp s1                  

   exit:  mov ax,4c00h
           int 21h                  
           
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 16:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表