学习经验:
在学习微机原理的时候课本上基本上只有关键词解释,基本上没有代码可以看和学习,但是最后的考试和平时的实验课又需要打代码,导致没有听课在看书学起来很痛苦,在这里点名批评《新编16_32位微型计算机原理及应用 第4版》这本书一言难尽,就算是听课了学起来也很痛苦。我的建议是学完前两章去看我推荐的另外一本书《汇编语言程序设计》这本书的关键词解释多,代码也多一些学起来很舒服,不会那么苦涩难懂
链接:https://pan.baidu.com/s/1Ot-R-bK4esjcR9YdXjsMZg?pwd=hb66
提取码:hb66
--来自百度网盘超级会员V3的分享
网盘里是三本书
《新编16_32位微型计算机原理及应用 第4版》
《新编16_32位微型计算机原理及应用--第4版--教学指导与习题详解》
《汇编语言程序设计》
这里分享一些平时的实验课的题目
(1-8)编写程序,将三个无符号字操作数X、Y、Z中的最大值送入MAX字单元中存储。
data segment
max dw ?
num dw 35h,34h,33h
ends
code segment
start:
mov ax, data
mov ds, ax
mov es, ax
mov si,0
mov ax,num[si]
mov bx,num[si+2h]
cmp bx,ax
jnb p1
mov bx,num[si+4h]
cmp bx,ax
jnb print
xchg bx,ax
jmp print
p1:
mov ax,num[si+4h]
cmp bx,ax
jnb print
xchg bx,ax
jmp print
print:
mov max,bx
mov dx,max
mov ax, 4c00h
int 21h
ends
end start
(2-8)编写程序,计算Y的值, X和Y之间的函数关系式如下,其中X、Y均为字节型变量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VT8xBOS1-1687540443207)(./assets/image-20230619135859839.png)]
data segment
x db 1
Y db 2
ends
code segment
ASSUME cs:code,ds:DATA
start:
mov ax, data
mov ds, ax
mov al,x
mov bl,y
cmp al,0
ja l1
jb l2
mov bl,0
jmp l3
l1:mov bl,1h
jmp l3
l2:mov bl,-1h
jmp l3
l3: mov ah,4ch
int 21h
ends
end start
(3-8)设变量Buffer中存放3个有符号字操作数,求这3个数中的最小值,并将其存放在BX寄存器中。
data segment
min dw ?
Buffer dw 35h,34h,33h
ends
code segment
start:
mov ax, data
mov ds, ax
mov es, ax
mov si,0
mov ax,Buffer[si]
mov bx,Buffer[si+2h]
cmp bx,ax
jle p1
mov bx,Buffer[si+4h]
cmp bx,ax
jle print
xchg bx,ax
jmp print
p1:
mov ax,Buffer[si+4h]
cmp bx,ax
jle print
xchg bx,ax
jmp print
print:
mov min,bx
mov bx,min
mov ax, 4c00h
int 21h
ends
end start
(4-9)在变量DBUF中存放10个有符号字节数,统计此数据区中正数、零和负数的个数,并分别将统计结果保存在字节变量PLUS、ZERO和MINS中。
DATA SEGMENT
BUFFER DB 1,2,3,4,5,6,-1,0,0,0
PLUS DB 0
ZERO DB 0
MINS DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV CX,10
MOV DS,AX
MOV SI,0
MOV AH,0
MOV BH,0
MOV BL,0
L:MOV AL,BUFFER[SI]
CMP AL,0
JGE L1
ADD BL,1
JMP L3
L1:
CMP AL,0
JG L2
ADD BH,1
JMP L3
L2:
ADD AH,1
L3:
DEC CX
ADD SI,1
CMP CX,0
JNZ L
MOV PLUS,AH
MOV ZERO,BH
MOV MINS,BL
MOV AH,4CH
INT 21H
CODE ENDS
END START
(5-9)2、统计字变量D1中二进制位为1的个数,并将统计结果保存在变量RESULT中。(例如,D1=0035H,则其中二进制位为1的个数为4,若D1=1075H,则其中二进制位为1的个数为6。)
【一种实现方法提示:循环16次,每次循环将AX内容逻辑右移1次,移出的值在CF中,再用ADC DL,0语句累加CF,结果保存在DL中。还可以有其他实现方法。】
DATA SEGMENT
BUFFER DW 1075H
RESULT DB 0
DATA ENDS
STACK SEGMENT STACK
DB 1000 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV AX,BUFFER
MOV CL,0
L:
AND AX,AX
JZ L2
SHL AX,1
JNC L
INC CL
JMP L
L2:
MOV RESULT,CL
MOV AH,4CH
INT 21H
CODE ENDS
ENDS START
(6-10) 每次从键盘输入一个大写字母,并将其转换为相应的小写字母输出显示到屏幕上,然后继续输入下一个字母;此转换一直进行到输入“#”号为止;若输入过程中输入了除大写字母和“#”以外的其他字符,则在屏幕上给出错误提示信息:“ERROR!”,并继续进行下一个大写字母的输入。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JqRiMdg-1687540443208)(./assets/image-20230619140548733.png)]
data segment
D1 DB 'ERROR' ,0DH,0AH,'$'
ENDS
STACK SEGMENT
DW 128 DUP(0)
ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS;CODE;
START:
; SET SEGMENT REGISTERS:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
MOV AH, 01H
INT 21H
CMP AL, '#'
JE EXIT
CMP AL, 'A'
JB ERROR
CMP AL, 'Z'
JA ERROR
CMP AL, 'A'
JA X
CMP AL, 'Z'
JB X
X:
ADD AL, 20H
MOV AH, 02H
MOV DL,AL
INT 21H
JMP START
ERROR:
MOV DX, OFFSET D1
MOV AH, 09H
INT 21H
JMP START
EXIT:
MOV AH, 4CH
INT 21H
MOV AX, 4C00H
ENDS
END START
(7-11)将BX寄存器中的数以十六进制数形式显示在屏幕上。例如,BX=13A4H,则在屏幕上显示13A4。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQ05LC8Q-1687540443209)(./assets/image-20230619140743838.png)]
DATA SEGMENT
BUF DB 0AH,0DH,
BUF0 DB 6 DUP(0)
ENDS
STACK SEGMENT
DW 256 DUP(0)
ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV BX,13A4H
LEA DI,BUF0
MOV CH,4
NEXT:
MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
OR AL,30H
CMP AL,3AH
JL DONE
ADD AL,07H
DONE:
MOV [DI],AL
INC DI
DEC CH
JNZ NEXT
MOV BYTE PTR[DI],'H'
INC DI
MOV BYTE PTR[DI],'$'
LEA DX,BUF
MOV AH,9
INT 21H
MOV AH, 4CH
INT 21H
ENDS
END START
(8-12)编程统计字符串中的数字、字母及其他字符(除数字、字母外)的个数,统计结果分别存放在num, char, other单元中。待检测的字符串为”In 1990, the exchange rate was 8.1 /$”。
DATA SEGMENT
STRING DB "IN 1990, THE EXCHANGE RATE WAS 8.1 /$"
STREND DB '?'
NUM DB 0
CHAR DB 0
OTHER DB 0
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX ; 默认附加段与数据段重叠
MOV CX, STREND-STRING ; 字符串长度
MOV SI, OFFSET STRING ; 源变址指针指向STRING
CONTINUE:
MOV DL, [SI] ;读取一个字符
CMP DL, 30H
JL OTHER_CHAR
CMP DL, 3AH
JL NUM_CHAR
CMP DL, 41H
JL OTHER_CHAR
CMP DL, 5BH
JL ALPHA_CHAR
CMP DL, 61H
JL OTHER_CHAR
CMP DL, 7BH
JL ALPHA_CHAR
OTHER_CHAR:
INC OTHER
JMP NEXT
NUM_CHAR:
INC NUM
JMP NEXT
ALPHA_CHAR:
INC CHAR
NEXT:
INC SI
LOOP CONTINUE
CODE ENDS
END START
(9-12)2、假设有30个学生的成绩分别为3 28 5 10 82 69 32 95 3 44 38 77 80 19 49 45 65 71 75 28 68 66 16 12 50 96 34 59 22 75, 编程统计60分以下、6069分、7079分、8089分、9099分、100分各分数段的人数,并存放到S4,S5, S6, S7, S8, S9, S10单元中。
DATA SEGMENT
SCORE DB 56,69,84,82,73,88,99,63,100,80
S5 DB 0
S6 DB 0
S7 DB 0
S8 DB 0
S9 DB 0
S10 DB 0
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX ; 默认附加段与数据段重叠
MOV SI, OFFSET SCORE ; 源变址指针指向SCORE
MOV CX, 10
CONTINUE:
MOV DL, [SI] ;读取一个成绩
CMP DL, 60 ;与60分比较
JL LS5 ;小于60分,转到LS5
CMP DL, 70
JL LS6
CMP DL, 80
JL LS7
CMP DL, 90
JL LS8
CMP DL, 100
JL LS9
JMP LS10
LS5: INC S5
JMP NEXT
LS6: INC S6
JMP NEXT
LS7: INC S7
JMP NEXT
LS8: INC S8
JMP NEXT
LS9: INC S9
JMP NEXT
LS10: INC S10
JMP NEXT
NEXT:
INC SI ;指针加1,指向下一个分数
LOOP CONTINUE
CODE ENDS
END START
(10-13)设有一数据区有10个无符号数的字节数据,位于数据段偏移地址为1000H开始的10个内存单元中。编写程序找出其中的最大数和最小数分别放置于BH和BL,并求最大最小值的平均值存放于AL中。要求将求最大最小值设计为子程序。
data segment
n1 db 01h,74h,43h,78h,98h,0a1h,0abh,0b1h,0bdh ,0afh
num EQU ($-n1)+1
ends
stack segment stack
dw 128 dup(0)
ends
code segment
assume CS:code,DS:data,SS:stack
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
mov cl,num
lea si,n1
l3: call p1
mov bh,dh ;最大值放入bh
mov ah,0 ;置零
mov ah,bl ;放入最小值
add ah,bh ;放入最大值
shr ah,1 ;左移除二
mov ax, 4c00h
int 21h
p1 proc near
mov dh,[si]
mov bl,[si]
l: mov bh,[si]
inc si
dec cl
jz end
cmp bl,bh ;经过比较放入较小值,比较完毕为最小值
ja l1
cmp dh,bh
jb l2
jmp l
l1:mov bl,bh
jmp l
l2:mov dh,bh
jmp l
end:mov cx,0;转跳结束随便输入
ret
p1 endp
ends
end start ; set entry point and stop the assembler.