16.1 描述了单元长度的标号
在数据前写标号时不添加“:”
此时标号名称代表的意义包含数据长度和数据地址
我们称它为数据标号(在他的后边一定要有数据类型,dd、dw、db等)
16.2 在其他段中使用数据标号
注意:
有“:”的地址标号只能在代码段中使用,不能在其他段中使用。
仅仅在assume中将段和寄存器联系起来不能真正联系起来,要想联系还要用mov将寄存器和段地址联系起来。
还可以将标号当作数据,这个时候如果标号前是dw就代表标号对应的偏移地址,如果是dd就代表偏移地址和段地址
seg操作符是取段地址
16.3直接定址表
编写子程序 以十六进制的形式在屏幕中间显示给定的字节型数据
屏幕显示ascll字符
字节型数据8位
16进制和2进制的关系是:四位二进制用一位16进制表示
那么一个8位的就要用两位16进制表示
书上说一个字节的高4位和低4位分开
代码前边说用al保存传送的数据。
下图表示如何将al分成两部分
![](https://img-blog.csdnimg.cn/img_convert/4d4a28b1e9a1781d9788c27f4d663810.jpeg)
mov ah,al ;将al中的值全部给ah
shr ah,1
shr ah,1
shr ah,1
shr ah,1 ;ah向右移动4位这样,ah'的低四位保存的就是al的高四位
and al,00001111b;将al的高四位置0
![](https://img-blog.csdnimg.cn/img_convert/c30617fad3b710b5f4279c28d064b96f.jpeg)
然后抄代码
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov al,66
call showbyte
mov ax,4C00h
int 21h
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] ;高4位作为table的偏移,取的对应的字符
mov bx,0b800h
mov es,bx
mov es:[160*12+40*2],ah
mov bl,al
mov bh,0
mov al,table[bx] ;低4位作为table的偏移,取的对应的字符
mov es:[160*12+40*2+2],al
pop es
pop bx
ret
code ends
end start
16.4 程序入口地址的直接定制表
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov ah,2
mov al,5
call setscreen
mov ax,4C00h
int 21h
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
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
code ends
end start
实验16新的int7ch
;ah传递功能号
;0:清屏
;1:设置前景色
;2:设置背景色
;3:向上滚动一行
;1、2号功能al传递颜色al=(0,1,2,3,4,5,6,7)
刚开始改变al但是不会改变颜色,后来把ret改成iret就可以了
用表格没弄出来不知道为啥,调试的时候发现是call出了问题但是不会解决
索性用判断吧
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
;ah传递功能号
;0:清屏
;1:设置前景色
;2:设置背景色
;3:向上滚动一行
;1、2号功能al传递颜色al=(0,1,2,3,4,5,6,7)
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov ax,cs
mov ds,ax
mov si,offset int7ch
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int7chend-offset int7ch
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ah,1
mov al,6
int 7ch
mov ax,4C00h
int 21h
int7ch: nop
set:
cmp ah,0
je do1
cmp ah,1
je do2
cmp ah,2
je do3
cmp ah,3
je do4
jmp short sret
do1: call sub1
jmp short sret
do2: call sub2
jmp short sret
do3: call sub3
jmp short sret
do4: call sub4
jmp short sret
sret: iret
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
int7chend:nop
code ends
end start
哔哩哔哩视频
assume cs:code,ds:data,ss:stack
data segment
db 128 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
;ah传递功能号
;0:清屏
;1:设置前景色
;2:设置背景色
;3:向上滚动一行
;1、2号功能al传递颜色al=(0,1,2,3,4,5,6,7)
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov ax,cs
mov ds,ax
mov si,offset int7ch
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int7chend-offset int7ch
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ah,2
mov al,6
int 7ch
mov ax,4C00h
int 21h
int7ch: jmp short set
table dw offset sub1-offset int7ch+200h
dw offset sub2-offset int7ch+200h
dw offset sub3-offset int7ch+200h
dw offset sub4-offset int7ch+200h
set: push bx
cmp ah,3
ja sret
mov bl,ah
mov bh,0
add bx,bx
add bx,offset table-offset int7ch +200h
call word ptr cs:[bx]
sret: pop bx
iret
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
int7chend:nop
code ends
end start