有长度标号
注意这里是没有
:
的标号
assume cs:code
code segment
a db 1,2,3,4,5,6,7,8
b dw 0
start: mov si,0
mov cx,8
s: mov al,a[si] ; a[si] 表示 a[0](cs:[0]) 的内容, 与 a 等价
mov ah,0
add b,ax ; b 的地址是 0008, 因此 add b,ax 等价于 add cs:[0008],ax
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start
不同段中使用标号
assume cs:code,ds:data
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
mov cx,8
s: mov al,a[si] ; a[si] 表示 a[0](cs:[0]) 的内容, 与 a 等价
mov ah,0
add b,ax ; b 的地址是 0008, 因此 add b,ax 等价于 add cs:[0008],ax
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start
存储标号地址
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
c dw a,b ; 相当于 offset a,offset b
data ends
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
c dd a,b ; 相当于 offset a,seg a,offset b,seg b
data ends
seg a
得到a
的段地址
直接定值表
数值0~F
与0~F
的ASCII
码没有一一对应的关系,因此建立一张表,将位置(数值)和字符建立一一对应的关系
; 以下程序实现 al=2B 即可在屏幕上显示 2B, al=3B 就显示 3B, 以此类推
assume cs:code
code segment
showbyte: jmp short show
table db '0123456789ABCDEF'
show: push bx
push es
mov ah,al
shr ah,1
shr ah,1
shr ah,1
shr ah,1
and al,00001111b
mov bl,ah
mov bh,0
mov ah,table[bx]
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah ; 显示高位
mov bl,al
mov bh,0
mov al,table[bx]
mov es:[160*12+40*2+2],al ; 显示低位
pop es
pop bx
ret
start: mov ax,002BH ; 将 16 进制拆成两个 8 进制, 高位 2 和低位 B
call showbyte ; 必须用 call 因为这会将 CS:IP 入栈, 调用 ret 才能正确返回
mov ax,4c00h
int 21h
code ends
end start
程序入口地址直接定址表
清屏
sub1: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
sub1s: mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
设置前景色
sub2: push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s: and byte ptr es:[bx],11111000b
or es:[bx],al
add bx,2
loop sub2s
pop es
pop cx
pop bx
ret
设置背景色
sub3: push bx
push cx
push es
mov cl,4
shl al,cl
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub3s: and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
ret
向上滚动一行
sub4: push cx
push si
push di
push es
push ds
mov si,0b800h
mov es,si
mov ds,si
mov si,160
mov di,0
cld
mov cx,24
sub4s: push cx
mov cx,160
rep movsb
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1: mov byte ptr [160*24+si],' '
add si,2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
主程序 ``` assume cs:code
code segment ; 各种子程序 setscreen: jmp short set
table: dw sub1,sub2,sub3,sub4
set: push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
call word ptr table[bx]
sret: pop bx
ret
start: mov ah,1 ; 功能选择 mov al,3 call setscreen
mov ax,4c00h
int 21h
code ends
end start ```