汇编学习--第二天

第三章 寄存器

3.4

 

问题3.5

 

检测点 3.1

(1)

mov ax,1  
mov ds,ax  
mov ax,[0] 2662h
mov bx,[1] e626h
mov ax,bx e626h
mov ax,[0] 2662h
mov bx,[2] d6e6h
add ax,bx fd48h
add ax,[4] 2c14h
mov ax,0 0h
mov al,[2] 00e6h
mov bx,0 0h
mov bl,[c] 0026h
add al,bl 000ch

 

段地址:偏移地址只是表示物理地址的方式,我们查看数据地址只看 段地址*16+偏移地址 的结果,例如0110:0000和0000:1100就是同一地址,数据相同。

 

(2)

第一问:执行序列:

1)mov ax,6622h

2)jmp 0ff0:0100

3)mov ax,2000

4)mov ds,ax

5)mov ax,[8]

6)mov ax,[2]

 

第二问

 

 

(3)数据和地址有区别,程序(指令)是对8086CPU运行顺序的改变,数据是对地址中数据的改变,显著区别就是操作指令的不同。

 

3.6 栈

mov ax,0123h

push ax

mov bx,2266h

push bx

mov cx,1122h

push cx

pop ax

pop bx

pop cx

 

 

任意时刻,SS:SP指向栈顶元素

 

问题 3.6

因为在执行命令之前,SP=SP-2,第一次执行命令的栈顶位置在1000E==>SS:1000H   SP=000EH

所以在第一次执行命令之前的位置在SP=SP+2==>SP:0010H

 

push先操作地址-2,再执行命令;pop先执行命令,再操作地址+2。

 

3.8 栈顶越界问题

 

问题 3.7

 

问题 3.8

mov ax,2000
mov ss,ax
mov sp,10
mov ax,1a
mov bx,1b
push ax
push bx
mov ax,0
mov bx,0
pop bx
pop ax

 

 

栈地址,段地址和内存地址不能使用同一地址,不然指令会是“乱指令”

???在问题3.12下讲栈段和数据段到同一地址,但是运行时出错。可能电脑问题,暂时放这。

猜测,应该是栈段和数据段同时使用同一地址,会出现“乱指令”

 

 

问题 3.9

实际上这里就是一个出栈问题,这里只要将上面代码AX,BX出栈顺序换一下就行。

mov ax,2000
mov ss,ax
mov sp,10
mov ax,1a
mov bx,1b
push ax
push bx
mov ax,0
mov bx,0
pop ax
pop bx

 

问题 3.10

把10000H处作为段空间就行

mov ax,1000
mov ss,ax
mov sp,2

 

3.10 栈段

问题 3.11

10000H~1FFFFH为栈空间,和之前一样,第一条指令在SS:1000,SP:FFFEH==>SP = SP + 2----SP:0000H

 

问题 3.12

SP变化是在0000H~FFFFH,每个内存空间1B,总共16*16*16*16=65536B,也就是64KB

 

检测点 3.2

(1)

mov ax,2000H
mov ss,ax
mov sp,10H

(2)

mov ax,1000H
mov ss,ax
mov sp,0H

 

实验2

(2)

d ds:10 18  ;查看1000:0010~1000:0018中的内容

d cs:0  ;查看当前代码段中的指令代码

d ss:0  ;查看当前栈段中的内容

 

u cs:0  ;以汇编指令的形式,显示当前代码段中的代码

a ds:0  ;以汇编形式从1000:0开始的内存写入指令

 

1--(3)

Debug的T命令在执行修改寄存器SS指令之后,下一条指令也紧接着被执行,也就是不会再DOSBOX上显示

 

2.实验任务

(1)

代码存入之后,T指令执行,D指令查看内存就行

 

(2)

 猜测栈空间被写入了数据

posted @ 2019-06-18 01:26  Hk_Mayfly  阅读(220)  评论(0编辑  收藏  举报