0%


🍀王爽 《汇编语言》 实验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
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
assume cs:code,ds:data,ss:stack

stack segment stack
db 0,0,0,0,0,0,0,0
stack ends

data segment
;年份
db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'
db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'
db '1993', '1994', '1995'
;收入
dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
;员工
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
data ends

table segment
db 21 dup ('year sumn ne ?? ')
table ends

code segment
start:
;初始化各段寄存器
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov ax,stack
mov ss,ax
mov sp,10h
;初始化两个大指针,bx给ds段,bp给es段
mov bx,0
mov bp,0
;初始化循环次数21次
mov cx,21

s:
push bx
push cx
push bx
push cx
;在每一次大循环开始时初始化两个小指针,si给ds段,di给es段,均指向一开始的单元
mov si,0
mov di,0
;设置小循环次数为4
mov cx,4

s1:
mov al,ds:[bx][si]
mov es:[bp][di],al
inc si
inc di
loop s1
;s1结束后si=di=4

;将bx移动到收入段对应的第1个单元
add bx,84
;将si设为0,di设为5,为了传送当前收入的四个单元
mov si,0
mov di,5
;设置小循环次数为4
mov cx,4
s2:
mov al,ds:[bx][si]
mov es:[bp][di],al
inc si
inc di
loop s2
;s1结束后si=4,di=9

;将bx移动到人数对应的第1个单元
mov bx,168
;将di移动至table段雇员数所在的第1个单元
mov di,10
pop cx
shl cx,1
mov dx,42
sub dx,cx
add bx,dx
mov cx,bx
mov ax,ds:[bx]
mov word ptr es:[bp][di],ax

;开始计算人均收入
;弹出一开始入栈的bx值赋给bx,此时bx值为当前年份的第1个单元
pop bx
;将bx移动到收入段对应的第1个单元
add bx,84
;收入值的低字赋给ax,高字赋给dx
mov ax,ds:[bx]
mov dx,ds:[bx+2]
;执行除法运算,计算人均收入
mov bx,cx
div word ptr ds:[bx]
;将di移动到当前人均收入的第1个单元
mov di,13
;除法结果的商保存在ax中
mov word ptr es:[bp][di],ax

;弹出之前入栈的cx值赋给cx
pop cx
;bx+4实现data段年份的偏移,执行后bx指向下一个年份
pop bx
add bx,4
;bp+16实现table段偏移,执行后bp指向table段的下一行行首单元
add bp,16

loop s

;结束程序
mov ax,4c00h
int 21h

code ends

end start
阅读全文 »


🍀王爽 《汇编语言》 实验9解答🍀

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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
assume cs:code,ds:data,ss:stack

data segment
db 'welcome to masm!'
db 2h,24h,71h
data ends

stack segment
dw 0,0,0,0,0,0,0,0
stack ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0b872h
mov es,ax
mov cx,3
mov si,16
s1:
push cx
mov bx,0
mov bp,0
mov cx,16

s2:
mov al,ds:[bx]
mov es:[bp],al
inc bx
inc bp
mov al,ds:[si]
mov es:[bp],al
inc bp
loop s2

inc si
mov ax,es
add ax,0ah
mov es,ax
pop cx
loop s1

g:mov cx,3
loop g

mov ax,4c00h
int 21h

code ends

end start
阅读全文 »


🍀王爽 《汇编语言》 实验3解答🍀

在这里插入图片描述
(1)、(2)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)
在这里插入图片描述
  一般来说,PSP是256个字节,当程度生成了可执行文件以后,在执行的时候,先将程序调入内存,这个时候DS中存入程序在内存中的段地址,紧接着是程序的一些说明,比如说程序占用多大空间等等,这就是PSP,一般PSP占256个字节,然后才是真正的程序地址,将CS指向这里,IP设为0000,为什么一般CS要比DS大10H,就是因为这个原因,简单说:DS存放的是程序段地址,由于PSP的存在,真正要执行的地址是DS再加上256个字节。
  以本例程的DS和CS为例,我们可以发现DS = 075A,CS = 076A,由此可得数据段首地址(真正的内存物理地址)为DS×16 + 0 = 075A0H,代码段首地址(真正的内存物理地址)为CS×16 + 0 = 076A0H,二者相差100H,恰好证明了这其中有2^8 = 256个存储单元,也即有256字节的存储空间被PSP段使用。
  解释:上述数据段的第一个存储单元(设为1单元)的地址是075A:0000(对应的实际物理地址为075A0),假设我们现在有一个地址为075A:0010的存储单元(设为2单元,对应的实际物理地址为075B0),显然我们可以发现从单元1到单元2的上面一个单元共有16个存储单元,而075B0H - 075A0H = 10H = 00010000B = 2^4D = 16D,表明了这之间有16个字节的存储空间,据此我们可简单推算出:从075A0到076A0上面那个单元共有256字节的存储空间为PSP段。


🍀王爽 《汇编语言》 实验2解答🍀

在这里插入图片描述
解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:在2000:0 f 内存中,存放了CS,IP,标志寄存器,具体可以看《汇编语言》12.11 单步中断部分内容。


🍀王爽 《汇编语言》 实验1解答🍀

在这里插入图片描述
解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解:
在这里插入图片描述
在这里插入图片描述
开始执行,直到AX=0100H,即AX=256
在这里插入图片描述
在这里插入图片描述
解:
在这里插入图片描述


实用工具/网站/博客
——————这里码了一些比较实用的工具&网站&博客&插件——————

1️⃣ HTML/Markdown/CSS

阅读全文 »