本文内容基于微机原理老师发的 2024年微机原理上机实验要求

重要的资源:

微机原理与接口技术(钱晓捷版)课后习题答案

实验任务1:熟悉DOS环境、熟悉汇编语言的开发过程和数据表达、变量定义及属性

1. 熟悉进入和退出32位控制台和16位DOS环境的方法。

2. 熟悉汇编语言的开发过程,实现教材例题2-1程序。

eg0201.asm
1
2
3
4
5
6
7
8
9
10
		include io32.inc
.data
msg byte 'Hello,Assembly!',13,10,0
.code
start:
mov eax,offset msg
call dispmsg

exit 0
end start

eg0201

3. 掌握数据寻址方式,上机实现教材中的例题2-2程序。

eg0202.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
include io32.inc
.data
count dword 12345678h,9abcdef0h,0,0,3721h
.code
start:
mov eax,33221100h
mov ebx,eax
mov ecx,count
mov ebx,offset count
mov edx,[ebx]
mov esi,[ebx+4]
mov esi,4
mov edi,count[esi]
mov edi,[ebx+esi]
mov ecx,[ebx+esi*4]
mov edx,[ebx+esi*4-4]
mov ebp,esp
call disprd
exit 0
end start

eg0202

4. 验证教材例题3-3,实现习题3.14程序。

eg0303.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	include io32.inc
.data
minint = 10
wvar1 word 0,32768,65535,-32768,0,+32767
wvar2 word 1,-1,38,-38,38h,-38h
wvar3 word ?
wvar4 word 2010h,1020h
word 5 dup(minint,?)
wvar6 word 3139h,3832h
bvar6 byte 39h,31h,32h,38h
byte 0
.code
start:
mov eax,offset wvar6
call dispmsg
exit 0
end start

eg0303

ex0314.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
		include io32.inc
.data;代码段
table byte ' | 0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10
byte '---+-------------------------------',13,10
byte '20 |',20h,20h,21h,20h,22h,20h,23h,20h,24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h
byte 2ah,20h,2bh,20h,2ch,20h,2dh,20h,2eh,20h,2fh,20h,13,10
byte '30 |',30h,20h,31h,20h,32h,20h,33h,20h,34h,20h,35h,20h,36h,20h,37h,20h,38h,20h,39h,20h
byte 3ah,20h,3bh,20h,3ch,20h,3dh,20h,3eh,20h,3fh,20h,13,10
byte '40 |',40h,20h,41h,20h,42h,20h,43h,20h,44h,20h,45h,20h,46h,20h,47h,20h,48h,20h,49h,20h
byte 4ah,20h,4bh,20h,4ch,20h,4dh,20h,4eh,20h,4fh,20h,13,10
byte '50 |',50h,20h,51h,20h,52h,20h,53h,20h,54h,20h,55h,20h,56h,20h,57h,20h,58h,20h,59h,20h
byte 5ah,20h,5bh,20h,5ch,20h,5dh,20h,5eh,20h,5fh,20h,13,10
byte '60 |',60h,20h,61h,20h,62h,20h,63h,20h,64h,20h,65h,20h,66h,20h,67h,20h,68h,20h,69h,20h
byte 6ah,20h,6bh,20h,6ch,20h,6dh,20h,6eh,20h,6fh,20h,13,10
byte '70 |',70h,20h,71h,20h,72h,20h,73h,20h,74h,20h,75h,20h,76h,20h,77h,20h,78h,20h,79h,20h
byte 7ah,20h,7bh,20h,7ch,20h,7dh,20h,7eh,20h,7fh,20h,13,10
byte 0
.code
start:
mov eax,offset table
call dispmsg
exit 0
end start

ex0314

eg0423.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.686
.model flat,stdcall
option casemap:none
includelib bin\kernel32.lib
includelib bin\user32.lib
ExitProcess proto,:DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
MessageBox equ <MessageBoxA>
NULL equ 0
MB_OK equ 0
.data
szCaption byte '消息窗口',0
outbuffer byte '本机的处理器是', 12 dup(0),0
outbufsize = sizeof outbuffer-1
.code
start: mov eax,0
cpuid ; 获得显示器信息
mov dword ptr outbuffer+outbufsize-12,ebx
mov dword ptr outbuffer+outbufsize-8,edx
mov dword ptr outbuffer+outbufsize-4,ecx
invoke MessageBox,\
NULL,addr outbuffer,addr szCaption,MB_OK
invoke ExitProcess,NULL
end start

eg0423

实验任务2:熟悉汇编语言中的常用传送和运算指令的应用

ex0320.asm
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
	include io32.inc	
.code
start:
mov eax,80h
call disprf
call disphd
call dispcrlf
add eax,3
call disprf
call disphd
call dispcrlf
add eax,80h
call disprf
call disphd
call dispcrlf
add eax,3
call disprf
call disphd
call dispcrlf
call dispcrlf

mov eax,100
call disprf
call disphd
call dispcrlf
add ax,200
call disprf
call disphd
call dispcrlf
call dispcrlf

mov eax,100
call disprf
call disphd
call dispcrlf
add al,200
call disprf
call disphd
call dispcrlf
call dispcrlf

mov al,7fh
call disprf
call disphd
call dispcrlf
sub al,8
call disprf
call disphd
call dispcrlf
sub al,80h
call disprf
call disphd
call dispcrlf
sbb al,3
call disprf
call disphd
call dispcrlf

exit 0
end start

实验任务3:掌握、理解位操作、串操作类指令

ex0328.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	include io32.inc
.data
bcd byte 92h
.code
start:
mov al,bcd
shr al,4
add al,30h
call dispc

mov al,bcd
and al,0fh
add al,30h
call dispc
exit 0
end start

实验任务4:掌握转移指令和分支程序结构

ex0405.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	include io32.inc
.data
no_msg byte 'Not Ready!',0
yes_msg byte 'Ready to Go!',0
.code
start:
;mov eax,58h ; 假设一个数据
mov eax,56h
;test eax,02h ; 测试D1位(使用D1=1,其他位为0的数据)
shr eax,2
;jnz yesm ; D1=1条件成立,转移
jnc yesm
mov eax,offset no_msg ; D1=0,显示没有准备好
jmp done ; 跳转过另一个分支体!
yesm: mov eax,offset yes_msg ; 显示准备好
done: call dispmsg

exit 0
end start

ex0405

ex0411.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
		include io32.inc
.data
inmsg byte 'Input number(0~9):',0
ermsg byte 0dh,0ah,'ERROR! Input again:',0
.code
start:
mov eax,offset inmsg
call dispmsg
again: call readc
cmp al,'0'
jb erdisp
cmp al,'9'
ja erdisp
call dispcrlf
call dispc
jmp done
erdisp: mov eax,offset ermsg
call dispmsg
jmp again
done:
exit 0
end start

ex0411

实验任务5:掌握循环指令和循环程序结构

① 掌握循环指令和循环程序结构。验证例题4-12程序,实现习题4.13程序。

eg0412.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	include io32.inc
.data
string byte 'Do you have fun with Assembly?',0 ; 以0结尾的字符串
.code
start:
xor ebx,ebx ;EBX用于记录字符个数,同时也用于指向字符的指针
again:
mov al,string[ebx]
cmp al,0
jz done
inc ebx ;个数加1
jmp again ;继续循环
done:
mov eax,ebx ;显示个数
call dispuid

exit 0
end start

eg0412

ex0413.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	include io32.inc
.data
string byte 'Do you have fun with Assembly ?',0 ;以О结尾的字符串
space dword ?
.code
start:
mov esi,offset string
xor ebx, ebx; EBX用于记录空格数
again:
mov al,[esi]
cmp al,0
jz donecmp al, 20h ;空格的ASCII 码是20H
jne next ;不相等、不是空格,转移
inc bx ;相等、是空格,空格个数加1
next:
inc esi
jmp again ;继续循环
done:
mov space, ebx ;保存结果
mov eax,space
call dispuid
exit 0
end start

ex0413

② 验证例题4-10程序。实现如下程序:进行自然数相加(1+2+3+……+N);如果(无符号整数的)累加和用一个32位寄存器存储,求出有效累加和的最大值及N的界限。

eg0410.asm
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
include io32.inc
.data
.code
start:
mov edx, 1
mov esi, 2

done1:
add edx, esi ; 自然数相加,求和
jc done ; 最高位进位,跳转
inc esi ; 加数加一
jmp done1 ; 重复进行自然数相加

done:
sub esi, 1 ; 加数减一,使累加和不进位而有效
mov ebx, 1
mov ecx, 2

nom:
add ebx, ecx ; 求得有效累加和
cmp ecx, esi ; 使加数到N的界限停止
jz again
inc ecx ; 加数加一
jmp nom ; 重复进行自然数相加

again:
mov eax, ebx ; 显示有效累加和的最大值
call dispuid
call dispcrlf ; 换行

mov eax, ecx ; 显示N的界限
call dispuid

exit 0
end start

来源:
Q:
现在你的环境为64位windows11系统,但是可以使用32位cmd运行make32指令。请基于使用io32.inc的32位汇编语言写一段代码,实现如下程序:进行自然数相加(1+2+3+……+N);如果(无符号整数的)累加和用一个32位寄存器存储,求出有效累加和的最大值及N的界限,并且输出这两个变量。特别注意,请将可以输出结果的完整程序代码写出。
A:
当然,我可以帮你写一段32位汇编语言的代码来实现这个功能。首先,让我们来分析一下问题。

你需要计算自然数相加的累加和(1 + 2 + 3 + … + N),并且将结果存储在一个32位寄存器中。然后,你要找到有效累加和的最大值以及N的界限。

以下是一个满足你需求的汇编代码示例,使用了 io32.inc 文件:

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
include io32.inc
.data
.code
start:
mov edx, 1
mov esi, 2

done1:
add edx, esi ; 自然数相加,求和
jc done ; 最高位进位,跳转
inc esi ; 加数加一
jmp done1 ; 重复进行自然数相加

done:
sub esi, 1 ; 加数减一,使累加和不进位而有效
mov ebx, 1
mov ecx, 2

nom:
add ebx, ecx ; 求得有效累加和
cmp ecx, esi ; 使加数到N的界限停止
jz again
inc ecx ; 加数加一
jmp nom ; 重复进行自然数相加

again:
mov eax, ebx ; 显示有效累加和的最大值
call dispuid
call dispcrlf ; 换行

mov eax, ecx ; 显示N的界限
call dispuid

exit 0
end start

这段代码首先使用 edxesi 寄存器进行自然数相加,直到累加和不再进位。然后,它计算有效累加和的最大值并找到N的界限。

请注意,这只是一个示例代码,你可以根据你的需求进行修改。如果你有其他问题或需要进一步的解释,请随时告知![1][2][3]

希望这对你有所帮助!