/* 編譯步驟:
把此文件復(fù)制到dosbox86\tc中,
運(yùn)行dosbox86
File->DOS Shell
cd \tc
tc
Alt+F選擇File->Load->ascii.c
Alt+C選擇Compile->Compile to OBJ 編譯
Alt+C選擇Compile->Line EXE file 連接
Alt+R選擇Run->Run 運(yùn)行
Alt+R選擇Run->User Screen 查看結(jié)果
*/
C語言程序如下:
#include <dos.h>
#include <bios.h>
main()
{
unsigned char a=0, hex[3];
char far *p = (char far *)0xB8000000;
int i, j, k;
_AX = 0x0003;
geninterrupt(0x10); /* 設(shè)置視頻模式為80*25文本模式, 同時起到清屏效果 */
for(j=0; j<11; j++) /* 共11列 */
{
p = (char far *)0xB8000000;
p += j*7*2; /* 計算第j列第0行的地址, 注意各列之間相距7個字符(含空格) */
/* 匯編中可以根據(jù)前后兩列首地址相差14字節(jié)的規(guī)律,用加法計算
出下一列的地址
*/
for(i=0; i<25; i++) /* 每列輸出25個ASCII碼, 即每列有25行 */
{
*p = a; /* 輸出當(dāng)前ASCII字符 */
*(p+1) = 0x0C; /* 背景為黑色, 前景為高亮度紅色 */
sprintf(hex, "%02X", a);
/* 匯編中可以利用上課講過的循環(huán)左移4位的方法把a(bǔ)的值轉(zhuǎn)化
成2位十六進(jìn)制并保存到數(shù)組hex中
*/
for(k=0; k<2; k++)/* 輸出2位十六進(jìn)制數(shù) */
{
*(p+2+k*2) = hex[k];
*(p+2+k*2+1) = 0x0A; /* 背景為黑色, 前景為高亮度綠色 */
}
a++;
if(a==0) /* 若a從0xFF變成0x00, 表示256個ASCII碼已窮盡 */
goto done;
p += 160; /* p指向第j列的第i+1行 */
}
}
done:
bioskey(0); /* 匯編中可以用mov ah,0; int 16h;代替此函數(shù)調(diào)用 */
}
對應(yīng)的匯編代碼如下:
assume cs:code,ds:data,ss:stack
data segment
a db 0h;
color_ascii db 0Ch ;背景黑色,前景高亮度紅色 00001100
color_num db 0Ah ;背景黑色掀抹,前景高亮度綠色 00001010
data ends
stack segment
db 16 dup (0)
stack ends
code segment
start:
cls:
mov ax,0B800H ;顯存地址
mov es,ax
mov bx,0
mov cx,4000 ;文本模式顯示25行傲绣,80字
s:
mov dx,0
mov es:[bx],dx
add bx,2
loop s
;實現(xiàn)清屏
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0B800H ;第1行起始位置
mov es,ax
mov dl,0 ;從第0個字符開始
mov bx,0
mov cx,11
mov di,0
loop_x:
push cx
mov cx,25
loop_y:
push cx
mov al,dl
mov es:[bx][di],al ;寫ASCII碼
mov ah,ds:[1]
mov es:[bx][di+1],ah ;寫ASCII碼的屬性
add di,2 ;寫完一個兆龙,移動兩個字節(jié)
mov al,dl
mov ah,0
mov cl,4
rol ax,cl
cmp ah,0Ah
jb num1
jnb character1
num1:
add ah,30h
character1:
cmp ah,10h
jnb write1
add ah,37h
write1:
mov es:[bx][di],ah ;寫ASCII碼對應(yīng)的數(shù)
mov ah,ds:[2]
mov es:[bx][di+1],ah ;寫數(shù)的屬性
add di,2 ;寫完一個忙迁,移動兩個字節(jié)
mov al,dl
mov ah,0
mov cl,4
rol ax,cl
ror al,cl
cmp al,0Ah
jb num2
jnb character2
num2:
add al,30h
character2:
cmp al,10h
jnb write2
add al,37h
write2:
mov es:[bx][di],al ;寫ASCII碼對應(yīng)的數(shù)
mov ah,ds:[2]
mov es:[bx][di+1],ah ;寫數(shù)的屬性
add di,2 ;寫完一個翔怎,移動兩個字節(jié)
inc dl ;顯示的ascii碼加1
cmp dl,0 ;ascii碼為0則跳轉(zhuǎn)至exit
je exit
add bx,160
sub di,6
pop cx
loop loop_y
pop cx
mov al,12
sub al,cl
mov bl,14
mul bl
mov di,0
add di,ax
;切換到下一列
mov bx,0
loop again
again: jmp loop_x
exit:
mov ah,0
int 16h
code ends
end start
結(jié)果如下:
DosBox下載的鏈接在下面給出
編譯運(yùn)行的方法如下:
運(yùn)行DosBox86
把.asm文件放到masm文件夾中
命令行輸入masm xxx(xxx是你的asm文件名)
緊跟著按三下回車
接著輸入link xxx
繼續(xù)按三下回車
生成可執(zhí)行文件xxx.exe
輸入xxx來運(yùn)行
DosBox86百度網(wǎng)盤鏈接:
https://pan.baidu.com/s/1t17msyPIW9gwCN2rKM7MNg
提取碼:
kss3