0%

从 CMOS RAM 读取时间并显示到屏幕。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
; 显示CMOS中当前日期时间
assume cs:code
code segment
src:
db 9,8,7,4,2,0 ; 年月日时分秒的地址
dst:
db 'yy/mm/dd hh:mm:ss',0

start:
mov ax,cs
mov ds,ax
mov si,offset src
mov di,offset dst
mov cx,6
s:
mov dx,cx
mov al,[si]
out 70h,al ; 70h为地址端口
in al,71h ; 71h为数据端口
mov ah,al
mov cl,4
shr ah,cl ; 右移4位,ah为十进制的十位数
and al,00001111b ; al为十进制的个位数
add ah,30h
add al,30h ; 数值转字符形式
xor ah,al
xor al,ah
xor ah,al ; 交换ah al的值
mov [di],ax
add di,3
inc si
mov cx,dx
loop s

mov ax,0b800h
mov es,ax
mov di,0
mov si,offset dst
s1:
mov ch,0
mov cl,[si]
jcxz ok
mov ch,2 ; 绿色字
mov es:[di],cx
inc si
add di,2
jmp s1
ok:
mov ax,4c00h
int 21h
code ends
end start
阅读全文 »

1、编写安装7ch号中断例程,显示0结尾的字符串

中断例程装载程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
; 8086实模式 中断例程装载程序
; 中断号 7ch
; 装载位置 0:200h

assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset handler ; ds:si指向中断例程的代码

mov ax,0
mov es,ax
mov di,200h ; es:di指向中断例程装载位置
mov cx,offset handlerend - offset handler ; 中断例程长度
cld
rep movsb ; 串传输

; 设置 7ch 号中断向量
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0

mov ax,4c00h
int 21h

handler:
; 注意!下文中断例程装载程序,只提供 handler 标号的部分,即,
; 中断处理程序开始 与 中断处理程序结束 包裹的部分

; 中断处理程序开始
; 显示0结尾的字符串
; dh 行号、dl 列号、cl 颜色、ds:si指向字符串首
push si
push es
push di
push ax
push dx
push cx

mov ax,0b800h ; 显存开始位置
mov es,ax
mov al,dh
mov dh,160
mul dh ; ax=行号*160
mov dh,0
add dx,dx ; dx=列号*2
add ax,dx
mov di,ax ; di=行号*160+列号*2

s:
mov al,[si]
cmp al,0
je ok
mov ah,cl
mov es:[di],ax
add di,2
inc si
jmp s

ok:
pop cx
pop dx
pop ax
pop di
pop es
pop si
iret
; 中断处理程序结束
handlerend:
nop

code ends
end start
阅读全文 »

可以修改IP,或者同时修改CS与IP的指令统称为转移指令

因为CS:IP是指令寄存器,比较特殊,且CS无法用其他寄存器直接赋值,如:mov cs,ax。

所以需要jmp,call,ret,loop等指令来修改IP或同时修改CS与IP。

CS:IP的组合用来实现8086CPU的20位寻址(虽然8086的寄存器是16位的,但8086内部有20位地址加法器)。

另外,8086CPU是小端模式。内存高地址存放数据高位,内存低地址存放数据低位。

转移指令种类

8086转移指令种类:

  • 无条件转移指令(如 jmp)

  • 条件转移指令(如 jcxz)

  • 循环指令(如 loop)

  • 过程(如 call、ret、retf)

  • 中断

伪指令offset

offset 是伪指令,由汇编器识别并处理,用于取得标号的偏移地址。如:

阅读全文 »

题目

在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串 welcome to masm!

这里的屏幕指的是,显卡文本模式下的屏幕,屏幕尺寸 80x25,可以显示彩色、高亮、闪烁的ASCII字符。

文本模式下一个字符由2个字节组成,即 ASCII+属性 = 2字节。属性字节的格式:

属性字节格式

阅读全文 »