Assembly

8086 14个寄存器

AX , BX , CX , DX , SI , DI , SP , BP, IP , CS , SS, DS ,ES ,PSW

环境搭建

ubuntu

https://github.com/froginwell/assembly

https://www.bilibili.com/s/video/BV1254y1B75r

macos

doxbox-x

从下载masm

https://github.com/froginwell/assembly/tree/master/software

实验

命令将cs修改成2000

命令将ip修改成1000

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
r cs 2000
r ip 0000

-a 2000:0
2000:0000 mov ax ,0123
2000:0003 mov bx, 3
2000:0006 mov ax , bx
2000:0008 add ax,bx
2000:000A
-u
2000:0000 B82301 MOV AX,0123
2000:0003 BB0300 MOV BX,0003
2000:0006 89D8 MOV AX,BX
2000:0008 01D8 ADD AX,BX

CS:IP 他们指示了CPU当前要读取指令的地址。

CS为代码段地址

IP 指令指针寄存器

jmp ax ,含义上类似 : mov IP , ax

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mov ax, 4E20
add ax, 1416
mov bx, 2000
add ax, bx
mov bx,ax
add ax,bx
mov ax, 001A
mov bx, 0026
add al,bl
add ah, bl
add bh, al
mov ah,0
add al,bl
add al,9C

copy 后 pdf的bl ,到这里后成了b1,导致计算问题

我 们 用 到 的debug 功 能 。
用Debug 的R 命令查看、改变CPU 寄存器的内容;
用Debug 的D命令查看内存中的内容;
用Debug 的E命令改写内存中的内容;
用Debug 的U 命令将内存中的机器指令翻译成汇编指令;
用Debug 的T工命令执行 一条机器指令;

用 Debug的 A 命 令 以 汇 编 指 令 的 格 式 在 内 存 中 写 入一 条 机 器 指 令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-t
AX=8236 BX=2000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=2000 IP=000B OV UP EI NG NZ NA PE NC
2000:000B 89C3 MOV BX,AX
-t
AX=8236 BX=8236 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=2000 IP=000D OV UP EI NG NZ NA PE NC
2000:000D 01D8 ADD AX,BX
-t
AX=046C BX=8236 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=2000 IP=000F OV UP EI PL NZ NA PE CY
2000:000F B81A00 MOV AX,001A
-t
AX=001A BX=8236 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=2000 IP=0012 OV UP EI PL NZ NA PE CY
2000:0012 BB2600 MOV BX,0026
-t
AX=001A BX=0026 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=2000 IP=0015 OV UP EI PL NZ NA PE CY
2000:0015 04B1 ADD AL,B1
-t
AX=00CB BX=0026 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0DAB ES=0DAB SS=0DAB CS=2000 IP=0017 NV UP EI NG NZ NA PO NC
2000:0017 80C4B1 ADD AH,B1

第三章

3.2 DS和address

debug中,内存单元从左到右是地址从低到高顺序排列的。

8086CPU自动取ds中的数据为内存单元的段地址

10000H 23
10001H 11
10002H 22
10003H 66

mov ax, [0]

[0] 是1123H ,

mov bx, [2]

[2] 是 6622

问题3.3

10000H 34
10001H 2C
10002H 22
10003H 11
1
2
3
4
5
6
7
8
9
10
11
12
-e 1000:0 23 11 22 66
-d 1000:0
-a //另一种输入方式
mov ax, 1000
mov ds,ax
mov ax, 2C34 //十进制 11316
mov [0],ax
mov bx, [0]
sub bx, [2]
mov [2],bx

-r

ds = 1000H

ax = 2C34H

bx = 2C34H // [0] 实际内存地址 = 1000 * 16 +0 = 10000

bx = 2C34H - 1122H = 1B12H

3.5数据段

监测点3.1

在 debug 中 , 用 “ d 0 : 0 1 f ” 查 看 内 存 , 结 果 如 下。
0000:0000 70 80 FO 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0, 写出每条汇编指令执行完后相关寄存器中的值。
mov ax, 1
mov ds, ax
mov ax, [0000]

[0000]实际访问地址是: 0010H ,所以 mov ax, [0000] 执行后,ax = 2662

物理地址 = DS × 16 + 偏移
= 0001H × 10H + 0000H
= 0010H

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-e 0000:0000 70 80 F0 30 EF 60 30 E2 00 80 80 12 66 20 22 60
-e 0000:0010 62 26 E6 D6 CC 2E 3C 3B AB BA 00 00 26 06 66 88
-a
mov ax, 1. //dosbox-x 运行后窗口会弹出分辨率变大,重新输入上面指令 执行就没问题
mov ds, ax
mov ax, [0000]
mov bx, [0001]
mov ax,bx
mov ax, [0000]
mov bx, [0002]
add ax,bx
add ax, [0004]
mov ax, 0
mov al, [0002]
mov bx, 0
mov bl, [000C]
add al, bl

-r

实验四

向内存0:200H0:23fH依次传送数据063(3FH)

内存0:200H~0:23fH空间与0020:0-0020:3f内存空间是一样的 (0:200 0020:0物理地址相同)

答案

https://www.cnblogs.com/Base-Of-Practice/category/1005745.html

https://blackdragonf.github.io/2017/03/09/%E7%8E%8B%E7%88%BD%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80%E7%AC%AC%E4%B8%89%E7%89%88%E5%AE%9E%E9%AA%8C/

视频 小甲鱼

剑指 Offer 58 - II. 左旋转字符串

数组System.arraycopy

深入分析用到了汇编指令,后面可以加强学习,其实底层的知识还是需要的,要不然没法深入下去了

https://blog.csdn.net/jackgo73/article/details/111866491

video看到了3 [bx+idata]方式寻址,都是质量和计算器的介绍,后面打算跳着看,不懂的再查。

3 [bx+idata]方式寻址_哔哩哔哩_bilibili


Assembly
https://noteforme.github.io/2021/05/21/Assembly/
Author
Jon
Posted on
May 21, 2021
Licensed under