有长度标号
注意这里是没有
:的标号
assume cs:codecode segmenta db 1,2,3,4,5,6,7,8b dw 0start: mov si,0mov cx,8s: mov al,a[si] ; a[si] 表示 a[0](cs:[0]) 的内容, 与 a 等价mov ah,0add b,ax ; b 的地址是 0008, 因此 add b,ax 等价于 add cs:[0008],axinc siloop smov ax,4c00hint 21hcode endsend start
不同段中使用标号
assume cs:code,ds:datadata segmenta db 1,2,3,4,5,6,7,8b dw 0data endscode segmentstart: mov ax,datamov ds,axmov si,0mov cx,8s: mov al,a[si] ; a[si] 表示 a[0](cs:[0]) 的内容, 与 a 等价mov ah,0add b,ax ; b 的地址是 0008, 因此 add b,ax 等价于 add cs:[0008],axinc siloop smov ax,4c00hint 21hcode endsend start
存储标号地址
data segmenta db 1,2,3,4,5,6,7,8b dw 0c dw a,b ; 相当于 offset a,offset bdata ends
data segmenta db 1,2,3,4,5,6,7,8b dw 0c dd a,b ; 相当于 offset a,seg a,offset b,seg bdata ends
seg a得到a的段地址
直接定值表
数值0~F与0~F的ASCII码没有一一对应的关系,因此建立一张表,将位置(数值)和字符建立一一对应的关系
; 以下程序实现 al=2B 即可在屏幕上显示 2B, al=3B 就显示 3B, 以此类推assume cs:codecode segmentshowbyte: jmp short showtable db '0123456789ABCDEF'show: push bxpush esmov ah,alshr ah,1shr ah,1shr ah,1shr ah,1and al,00001111bmov bl,ahmov bh,0mov ah,table[bx]mov bx,0b800hmov es,bxmov es:[160*12+40*2],ah ; 显示高位mov bl,almov bh,0mov al,table[bx]mov es:[160*12+40*2+2],al ; 显示低位pop espop bxretstart: mov ax,002BH ; 将 16 进制拆成两个 8 进制, 高位 2 和低位 Bcall showbyte ; 必须用 call 因为这会将 CS:IP 入栈, 调用 ret 才能正确返回mov ax,4c00hint 21hcode endsend start
程序入口地址直接定址表
清屏
sub1: push bxpush cxpush esmov bx,0b800hmov es,bxmov bx,0mov cx,2000sub1s: mov byte ptr es:[bx],' 'add bx,2loop sub1spop espop cxpop bxret
设置前景色
sub2: push bxpush cxpush esmov bx,0b800hmov es,bxmov bx,1mov cx,2000sub2s: and byte ptr es:[bx],11111000bor es:[bx],aladd bx,2loop sub2spop espop cxpop bxret
设置背景色
sub3: push bxpush cxpush esmov cl,4shl al,clmov bx,0b800hmov es,bxmov bx,1mov cx,2000sub3s: and byte ptr es:[bx],10001111bor es:[bx],aladd bx,2loop sub3spop espop cxpop bxret
向上滚动一行
sub4: push cxpush sipush dipush espush dsmov si,0b800hmov es,simov ds,simov si,160mov di,0cldmov cx,24sub4s: push cxmov cx,160rep movsbpop cxloop sub4smov cx,80mov si,0sub4s1: mov byte ptr [160*24+si],' 'add si,2loop sub4s1pop dspop espop dipop sipop cxret
主程序 ``` assume cs:code
code segment ; 各种子程序 setscreen: jmp short set
table: dw sub1,sub2,sub3,sub4set: push bxcmp ah,3ja sretmov bl,ahmov bh,0add bx,bxcall word ptr table[bx]sret: pop bxret
start: mov ah,1 ; 功能选择 mov al,3 call setscreen
mov ax,4c00hint 21h
code ends
end start ```
