蒙珣的博客

活好当下,做好今天该做的事情。

0%

实验11 编写子程序

debug 模式下标志位的显示

标志 真值为1 假值为0
OF OV NV OV = overflow(溢出) NV = not overflow
SF NG PL NG = negative(负数) PL = Positve
ZF ZR NZ ZR=Zero NZ = not Zero
PF PE PO PE = EVEN(偶数) PO = ODD
CF CV NC CY = Carry Yes(进位) NC = not Carry
DF DN UP Down(向下) Up(向上)

编写一个子程序,将包含任意字符,以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
;编写一个子程序,将包含任意字符,以0结尾的字符串的小写字母转变为大写字母

;名称:letterc
;功能:将以0结尾的字符串中的小写字母转变为大写字母
;参数:ds:si指向字符串首地址

assume cs:codesg

datasg segment

db "Beginner's All-purpose Symbolic Instruction Code.",0

datasg ends

codesg segment

begin: mov ax,datasg
mov ds,ax
mov di,0
mov cx,0
call letterc

mov ax,4c00h
int 21h

;思路:遍历字符串,如果小于ASCII表中的值,就and转变为大写字母。通过jcxz判断0结束循环
;ASCII表中小写字母的值大于大写字母的值,其中a为61H

letterc: mov cx,ds:[di]
jcxz ok
cmp byte ptr ds:[di],61H
jnb change
inc di
jmp short letterc

change: and byte ptr ds:[di],11011111b
inc di
jmp short letterc

ok: ret

codesg ends

end begin

这次我们将两个字符串显示在屏幕中间

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

;编写一个子程序,将包含任意字符,以0结尾的字符串的小写字母转变为大写字母,并将其显示在屏幕中间

;名称:letterc
;功能:将以0结尾的字符串中的小写字母转变为大写字母
;参数:ds:si指向字符串首地址

assume cs:codesg

datasg segment

db "Beginner's All-purpose Symbolic Instruction Code.",0

datasg ends

stack segment stack

db 128 dup (0)

stack ends

codesg segment

begin: mov ax,stack
mov ss,ax
mov sp,128

call init_reg
call init_show
call init_let
mov si,160*11 + 20*2
call init_show

mov ax,4c00h
int 21h

;思路:遍历字符串,如果小于ASCII表中的值,就and转变为大写字母。通过jcxz判断0结束循环
;ASCII表中小写字母的值大于大写字母的值,其中a为61H

init_let: push di
push ds
push cx

letterc: mov cx,ds:[di]
jcxz ok
cmp byte ptr ds:[di],61H
jnb change
inc di
jmp short letterc

change: and byte ptr ds:[di],11011111b
inc di
jmp short letterc

ok: pop cx
pop ds
pop di
ret

;===========================================
;将字符串显示在屏幕中间
init_show: push si
push di
push dx
push es
push ds


show_str: mov dl,ds:[di]
cmp dl,0
je show_Ret
mov es:[si],dl
add si,2
inc di
jmp show_str

show_Ret: pop ds
pop es
pop dx
pop di
pop si
ret
;===========================================

init_reg: mov ax,datasg
mov ds,ax

mov bx,0B800H
mov es,bx

mov di,0
mov si,160*10 + 20*2
mov cx,0
ret

codesg ends

end begin