实验4

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
DATA SEGMENT
STR1 DB 'EWRFWERFDFSSADFSDFSDSDF'
N EQU $-STR1
DATA ENDS

EXTRA SEGMENT
STR2 DB 'ASDFASDFSDFSDFSDFSDFSDF'
EXTRA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:EXTRA
START:MOV AX,DATA
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
MOV SI,OFFSET STR1
LEA DI,STR2
MOV CX,N
CLD
REPNZ CMPSB
JZ NEXT
MOV DL,'N'
JMP DISP
NEXT: MOV DL,'Y'
Disp:MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START

1
2
3
4
5
6
7
8
9
10
11
CODE SEGMENT
ASSUME CS:CODE
START:MOV AX,DS
MOV ES,AX
MOV AL,'$'
MOV DI,2100H
MOV CX,10H
CLD
REP STOSB
CODE ENDS
END START

实验5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATE SEGMENT
STRING db 'GOOD MORNING !','$' ;定义字符串
DATE ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATE
START:
MOV AX,DATE
MOV DS,AX
MOV DX,OFFSET STRING
MOV AH,09H
INT 21H
MOV AX,4CH
INT 21H
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
DATAS SEGMENT
STR DB"please input a string:$"
BUF DB 20
DB ?
DB 20 DUP (?)
CRLF DB 0AH,0DH,"$";此处输入数据段代码
DATAS ENDS
STACKS SEGMENT STACK
DB 200 DUP(?) ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START: MOV AX,DATAS
MOV DS,AX
LEA DX,STR
MOV AH,9
INT 21H
MOV AH,10
LEA DX,BUF
INT 21H
LEA DX,CRLF
MOV AH,9
INT 21H
MOV CL,BUF+1
LEA SI,BUF+2
NEXT: MOV DL,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ NEXT;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START

实验6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DATA SEGMENT
A DW 123
B DW 456
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START:PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,A
ADD AX,B
RET
MAIN ENDP
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
DATA SEGMENT
INPUT DB 'Plase enter a number(0~9):X=$'
PRINT DB 'Y=2X+6=$'
ENTER DB 10,13,'$'
NUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:MOV AX,DATA
MOV DS,AX
mov dx, offset INPUT;输入提示,这里等于LEA DX,INPUT;输入提示
MOV AH,09H
INT 21H

MOV AH,01H;输入
INT 21H

MOV NUM,AL;定义变量num
AND AL,0FH;将 AL 的高 4 位清零,只保留低 4 位的值。计算2X+6
ADD AL,AL
ADD AL,6
AAM;用于将二进制数转换为十进制数。它将一个字节的二进制数除以 10,将商存储在 AH 寄存器中,余数存储在 AL 寄存器中。
MOV BX,AX;在之前的代码中,我们使用了 AAM 指令将计算得到的 Y 值存储在 AX 寄存器中。
LEA DX,ENTER;换行;通过执行 MOV BX, AX,我们将 Y 值的十位数部分存储在 BX 的高字节(BH)中,将个位数部分存储在 BX 的低字节(BL)中。
MOV AH,09H
INT 21H

LEA DX,PRINT;输出提示
MOV AH,09H
INT 21H

MOV DL,BH;输出十位数部分存储在 BX 的高字节(BH)中
ADD DL,30H;转换ascii值
MOV AH,02H
INT 21H

MOV DL,BL;个位数部分存储在 BX 的低字节(BL)中
ADD DL,30H;转换ascii值
MOV AH,02H
INT 21H

MOV AH,4CH;结束
INT 21H
CODE 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
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC FAR
START:
MOV AH,01H
INT 21H
SUB AL,30H

MOV BL,AL

MOV AH,01H
INT 21H

SUB AL,30H

MUL BL

MOV BH,AH
MOV BL,0AH
DIV BL

ADD AH,30H
ADD AL,30H
MOV BX,AX
MOV DL,BL
MOV AH,02H
INT 21H
MOV DL,BH
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START

实验7

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
DATA SEGMENT
input db "Hello, World!",0
search db 'o'
found db 'Y$'
not_found db 'N$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

START:
mov ax, DATA
mov ds, ax

mov si, OFFSET input ; si指向输入字符串的起始位置
mov al, search ; al中存储要搜索的字符
and cx,0

SEARCH_LOOP:
mov dl, [si] ; 从si指向的内存位置读取一个字符到dl寄存器
cmp dl, 0 ; 检查是否到达字符串结尾
je NO ; 如果到达结尾,则未找到字符

cmp dl, al ; 检查当前字符是否与搜索字符相等
je YES ; 如果相等,则找到了字符

inc si ; si指针向后移动一个字节
jmp SEARCH_LOOP ; 继续循环查找下一个字符
YES:
; 显示'Y'
mov ah, 9
lea dx, found
int 21h
jmp EXIT
NO:
; 显示'N'
mov ah, 9
lea dx, not_found
int 21h
EXIT:
mov ah, 4Ch
int 21h

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
70
71
72
73
74
75
76
77
assume cs:code,ds:data

data segment
str1 db 0AH,'Input decimal number: ','$'
str2 db 0AH,'Hexadecimal number: ','$'
result db 8 dup('$')
data ends

code segment
start:
mov ax, data
mov ds, ax
mov es, ax
call readchar
call convert
mov ah, 4ch
int 21h

readchar proc near ;读入函数
lea dx, str1
mov ah, 09h
int 21h
mov bx, 0

input:
mov ah, 01h
int 21h
cmp al, 0dh ; 判断是否回车键,回车键结束输入
je exit
cmp al, '9' ; 输入字符不是数字,结束输入
ja exit
cmp al, '0'
jb exit
sub al, '0' ;把字符转换为数字
mov ah, 0h ;避免ah数值的影响
mov dx, ax
mov ax, bx
mov bx, dx
mov cx, 0ah
mul cx ; 把之前输入的数乘以10,加上本次输入,保存到bx
mov dx, ax
mov ax, bx
mov bx, dx
add bx, ax
jmp input

exit:
ret
readchar endp

convert proc near ;转换函数
lea dx, str2
mov ah, 09h
int 21h
mov ch, 04h
loopc:
mov cl, 04h
rol bx, cl
mov al, bl
and al, 0fh
add al, 30h
cmp al, '9'
jbe printf ;字符为'9'之下,直接显示。
add al, 07h ;大于9的数字转换为'A'-'F'

printf:
mov dl, al
mov ah, 02h
int 21h
dec ch
jnz loopc ; 单独用ch进行循环操作
ret
convert endp

code ends
end start

实验8

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
data segment
A DB 'HelloWOR$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

MOV DX,0
LEA BX,A
L:
MOV AL,[BX]
CMP AL,'$'
JE FIN
INC DX
INC BX
JMP L
FIN:
ADD DX,30H
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
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
DATA SEGMENT
A DB 10,-5,8,-3,0,2,-1,7,-4,6
COUNT EQU $-A
LEN DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,COUNT
MOV DX,0
MOV SI,OFFSET A
L:
MOV AL,[SI]
CMP AL,0
JG L1
INC SI
LOOP L
L1:
INC SI
INC DX
LOOP L
FIN:
ADD DX,30H
;MOV LEN,DX
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START