新浪博客

汇编语言(王爽第三版)实验2用机器指令和汇编指令编程

2017-05-12 18:03阅读:
实验2 用机器指令和汇编指令编程
1.预备知识:Debug的使用
1】合理利用在debugcsdssses4个段寄存器。简化debug命令格式。
2】注意在执行t命令时,如遇到初始化栈结构的指令,为了避免sp指针设置出问题,mov ssaxmov sp10一个执行了。这个涉及到了t命令的单步中断问题,下面章节有介绍。
2.实验任务
1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax, ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]

push ax
push bx
pop ax
pop bx

push [4]
push [6]
程序分析:
1】我采用的系统是XP sp3的系统自带的debug。不同的系统,可能产生的结果不同,在于体会它的原理。你看你自己debug的显示结果。
debug程序运行后执行r命令查看状态如下:
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B04 ES=0B04 SS=0B04 CS=0B04 IP=0100 NV UP EI PL NZ NA PO NC
2】我们使用d命令显示下:内存情况
-d ffff:0
FFFF:0000 EA 5B E0 00 F0 31 30 2F-30 35 2F 30 37 00 FC AD .[...10/05/07...
FFFF:0010 34 12 00 00 00 00 00 00-00 00 00 00 00 00 00 00 4...............
……
我们发现貌似是主板的BIOS信息
我们再查看下2200H段内存信息
-d 2200:0
2200:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2200:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
2200:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
……
发现是未开发的处女地。内存单元都是00H
3】强调,在debug中,汇编指令操作数如果是立即数,它们都是16进制的,如2200FFFF等,你不需要标明H
4】将这个代码块写在哪?看看ip=100cs值不动了,直接从cs100处将这个代码段写入内存吧。
使用a命令。
-a cs:100
0B04:0100 mov ax,ffff
0B04:0103 mov ds,ax
0B04:0105 mov ax,2200
0B04:0108 mov ss,ax
0B04:010A mov sp,0100
0B04:010D mov ax,[0]
0B04:0110 add ax,[2]
0B04:0114 mov bx,[4]
0B04:0118 add bx,[6]
0B04:011C push ax
0B04:011D push bx
0B04:011E pop ax
0B04:011F pop bx
0B04:0120 push [4]
0B04:0124 push [6]
5】我们逐步分析:
mov ax, ffff
mov ds,ax
代码含义:首先将ds指向了FFFF段内存,也就是数据段是ffffH00开始的内存单元了。
mov ax,2200
mov ss,ax
mov sp,0100
代码含义:人为建立一个栈结构,ss指向2200H段的内存,初始化栈顶指针是100Hss:sp指向栈底后面第一个单元(目前栈结构是空);也就是说这个栈结构栈底后面第一个单元地址是2200:100H(物理地址:22100H);这个栈容量是多少?100H个字节=256个字节=128个字单元。
执行完答案如下:
mov ax, ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100
;参看自己机器上的ds段内存,我的上面都显示出来了。
mov ax,[0] ;ax=5BEA
;ax=ax+[2]=5BEA+00E0=5CCA
add ax,[2] ;ax=5CCA
mov bx,[4] ;bx=31F0
;bx=bx+[6]=31F0+2F30=6120
add bx,[6] ;bx=6120
;ax=5CCA压栈;sp=sp-2=100H-2,此时栈中就一个元素(5CCA
push ax ;sp=FEH ;修改的内存单元的地址是 2200FEFF 内容为:CA 5C
;bx=6120压栈;sp=sp-2=FEH-2=FCH,此时栈中2个元素了。
push bx ;sp=FCH ;修改的内存单元的地址是 2200FCFD 内容为:20 61
;将栈顶元素(6120)弹出送入ax中,首先ax=6120,然后sp=sp+2=FCH+2=FEH
pop ax ;sp=FEH ;ax=6120
;将栈顶元素(5CCA)弹出送入bx中,首先bx=5CCA,然后sp=sp+2=FEH+2=00H,栈空。
pop bx ;sp=00H ;bx=5CCA
;将内存单元[4][6]压栈,
push [4] ;sp=FEH ;修改的内存单元的地址是 2200FEFF 内容为:F0 31
push [6] ;sp=FCH ;修改的内存单元的地址是 2200FCFD 内容为:30 2F
程序理解:
1】以上是我们人为的创建了一个栈的结构,这个栈最大使用空间是256字节(100H),栈是个逻辑结构,它的实质就是一段连续的内存空间,只不过访问内存的方式不像我们原来的CPU寻址方式,使用pushpop访问。
2】栈使用的实际空间是

我的更多文章

下载客户端阅读体验更佳

APP专享