組合語言實現功能(4)顯示功能
阿新 • • 發佈:2018-12-10
問題1:在螢幕中間分別顯示綠底,綠底紅色,白底藍色的字串“Welcome to masm!”
分析:
1 如何確定字元要顯示的位置
- 在80*25的彩色字元模式顯示緩衝區在記憶體地址的B8000H~BFFFFH共32KB的空間中
- 在該模式下,顯示器可以顯示25行,80列
- 所以在一行中就有80個字元,共佔據160個位元組,每個字元低位位元組儲存字元的ASCII碼,高位位元組儲存字元的顏色屬性
- 偏移0000~009F對應的就是顯示器上的第一行;
- 偏移0A00~13F0對應的就是顯示器上的第二行;......依次類推
確定3行字元在每一行的起始位置
- 因為顯示的在螢幕的中間,共需要32個位元組,螢幕中一行共160個位元組,所以開始位元組為(160 - 32)/ 2 = 64
確定3行字元在螢幕中的哪一行
- 因為螢幕中一共25行,要顯示3行字串,一行有160個字串,則第一行的開始位置是(25 - 3)/ 2 * 160 = 6E0H
- 第二行的開始位置是6E0H + 160 = 780H
- 第三行的開始位置是780H + 160 = 820H
2 如何確定字元要顯示的顏色屬性
- 每個字元的顏色屬性佔據一個位元組,每一位表示的不同的顏色屬性,則共有256種顏色屬性
- 屬性位元組的格式:
- 7 (6 5 4) 3 (2 1 0)
- BL (R G B) I (R G B)
- 閃爍 背景 高亮 前景
- 綠底黑色:0 010 0 000B (20H)
- 綠底紅色:0 010 0 100B (42H)
- 白底藍色:0 111 0 001B (71H)
assume cs:code,ds:data data segment db 'Welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov bx,0 ;ds:bx指向資料段起始位置 mov ax,0B800H mov es,ax ;設定顯示記憶體空間的起始位置 mov si,64 ;設定字串在一行中的中間位置 mov cx,16 ;設定迴圈的次數為字串的長度 s: mov al,ds:[bx] mov ah,20H ;設定第一行的開始位置和顏色 mov es:[si+6E0H],ax mov ah,42h ;設定第二行的開始位置和顏色 mov es:[si+780H],ax mov ah,71h ;設定第三行的開始位置和顏色 mov es:[si+820H],ax inc bx ;設定字串的偏移 add si,2 ;設定下一次迴圈的寫入位置 loop s mov ax,4c00h int 21h code ends end start
問題2:設計一個子程式,使呼叫者決定顯示的位置,內容和顏色
分析:
- 要實現的功能:在指定的位置,用指定的顏色,顯示一個用0結束的字串
- 指定的引數:行號-dh(取值範圍0~24),列號-dl(取值範圍0~79),取值範圍主要是根據顯示器螢幕的大小
- 顏色-cl,ds:si指向字串的首地址