1
2
3
4
5
6
7
sub al,al ZF=1,PF=1,SF
mov al,1 ZF=0,PF=0,SF
push ax
pop bx
add al,bl
add al,10
mul al

实验十

打印字符

这里的重点是不知道字符串的长度,但是知道字符串十以0结尾的,所以利用 cx = 0 jcxz 会跳转,不断地置ch=0,当取到的字符cl=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
assume cs:code

data segment
db 'Welcome to masm!', 0
data ends


code segment

start:
mov dh,8 ;dh表示行号
mov dl,3 ;dl表示列号
mov cl,2 ;cl表示颜色
mov ax,data
mov ds,ax
mov si,0 ;字符串开始的位置

call show_str
mov ax,4c00h
int 21h

show_str:

mov ax,0b800h
mov es,ax ;显存段

mov di,0
mov ax, 160
mul dh
add di,ax

mov al,2
mul dl
add di,ax ;计算开始的位置

mov bl,cl ;保存颜色,因为cx要用来计数


s:
mov cl, ds:[si] ;取出字符
mov ch,0 ;当cl=0的时候,cx也等于0,此时执行jcxz
jcxz ok
mov es:[di], cl
mov es:[di+1], bl
add di,2
inc si
loop s
ok: ret

code ends
end start

进制转换

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
assume cs:code

data segment
db 10 dup(0)
data ends

code segment

start:
mov ax,12666
mov bx,data
mov ds,bx

mov si,0

call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str

mov ax,4c00h
int 21h
dtoc: mov si,9
s0: mov cx,10
mov dx,00 ;dx存放余数
div cx
add dx,30H
mov [si],dl

mov cx,ax ;判断商是否为0
jcxz rt

dec si
inc cx ;防止cx=1的时候意外退出循环
loop s0
rt: ret


show_str:

mov ax,0b800h
mov es,ax ;显存段

mov di,0
mov ax, 160
mul dh
add di,ax

mov al,2
mul dl
add di,ax ;计算开始的位置

mov bl,cl ;保存颜色,因为cx要用来计数


s:
mov cl, ds:[si] ;取出字符
mov ch,0 ;当cl=0的时候,cx也等于0,此时执行jcxz
jcxz ok
mov es:[di], cl
mov es:[di+1], bl
add di,2
inc si
loop s
ok: ret

code ends
end start