如何实现数组数据在屏幕以左对齐显示?求助
本帖最后由 帝企鹅的日记 于 2018-6-19 22:57 编辑例如:
...
name db 'dfhw',‘$','oewirut','$'
score db 15,24
...
显示结果为
dfhm 15
oewirut 24
求助,感谢!
就像c语言中的/t功能 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 ]
果然有 bug
不要看上面的了
直接看 Res.zip 的内容就好
人造人 发表于 2018-6-19 23:40
果然有 bug
不要看上面的了
直接看 Res.zip 的内容就好
谢谢 本帖最后由 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]