汇编语言与微机原理-变量的调试与分析

简介: 汇编语言与微机原理-变量的调试与分析

请对源程序文件中的源程序 利用debug进行调试分析,

请提交调试截图(截图加上适当标记或注释)以及 通过调试分析收获理解了的知识点、体会等文字叙述。

DSEG    SEGMENT
  ORG 10H
  VARB DB 'ABCDE'             
  EVEN
  VARW DW 3 DUP(5),4 DUP(-1)  
  BUFW EQU THIS WORD
  BUFBB LABEL BYTE
  VARD DD 1234H,5678H,3 DUP(5)
  BUFB EQU BYTE PTR VARD  
DSEG    ENDS
CSEG    SEGMENT
  ASSUME  CS: CSEG, DS: DSEG
START:  MOV   AX, DSEG
  MOV DS, AX
  MOV  AX, TYPE VARB  
  MOV  BX, LENGTH VARW
  MOV  CX, SIZE VARD
  MOV  SI, SEG VARD
  MOV  DI, OFFSET VARD
  MOV  BH, BYTE PTR VARD
  MOV  DI, WORD PTR VARD
  MOV  DL, BUFBB
  MOV  DH, BUFB
  MOV  BP, BUFW
  .RADIX 16
  MOV  AH,0EF 
  MOV AX, 4C00H
  INT   21H
CSEG    ENDS
  END START

在执行masm task1.asm后,输出了task1.obj和task1.lst。task1.lst可以看到机器码和汇编的源码。

执行link task1.obj,输出了可执行文件task1.exe。

对task1.exe进行调试,输入debug task1.exe

输入-u进行反汇编

其中,

076E:0000指令对应了源汇编程序的MOV AX,DESG,desg为段地址076A

076E:0003指令调用的都是变量而不是常量。

076E:0005指令对应了MOV AX, TYPE VARB。TYPE VARB为VARB的类型DB,值为1。

076E:0008指令对应了MOV BX, LENGTH VARW。LENGTH VARW为VARW的第一个DUP前的数值3。

076E:000B指令对应了MOV CX, SIZE VARD。SIZE VARD为VARD的LENGTHTYPE=14=4。

076E:000E指令对应了MOV SI, SEG VARD。SEG VARD为VARD的段地址。VARD在DSEG段内,段地址为076A。

076E:0011指令对应了MOV DI, OFFSET VARD。OFFSET VARD为VARD的偏移地址0024。

076E:0014指令对应了MOV BH, BYTE PTR VARD。[0024]表示访问偏移地址0024内的值。

076E:0018指令对应了MOV DI, WORD PTR VARD。[0024]表示访问偏移地址0024内的值。

076E:001C指令对应了MOV DL, BUFBB ,BUFBB为byte类型的label,标在了VARD上,而VARD偏移地址为0024.

076E:0020指令对应了MOV DH, BUFB。在数据段,BUFB EQU BYTE PTR VARD。BUFB等效于VARD的指针,指向VARD偏移地址0024。

076E:0024指令对应MOV BP, BUFW。在数据段,BUFW EQU THIS WORD。而当前指向的存储单元就是VARD偏移地址0024.

上述提到的bufbb,bufb,bufw与地址的对应关系都可以在lst文件中直观地看到。

.RADIX 16为伪指令,使得后续汇编语句都操作十六进制数。

076E:0028和076E:002A分别对应MOV AH,0EF和MOVAX, 4C00H。

076E:002D对应INT 21H,引发中断。

输入-g 20,将程序运行到第20H行(第32行)但不退出,创建断点并输出该断点时各个变量的值。(如果没有创建断点,则会导致程序正常结束运行而不能观察此时内存状态)

AX的值由MOV AX, TYPE VARB决定,为01。

BX的值由MOV BX, LENGTH VARW决定,为03。

CX的值由MOV CX, SIZE VARD决定,为04.

DX的值没有被汇编语句重新写入,用作通用寄存器作为地址寄存器。

SP的值没有被汇编语句重新写入,用作堆栈指针。

SI的值由MOV SI, SEG VARD决定,为076A。

DI的值由MOV DI, OFFSET VARD决定,为0024存的字1234H。

DS的值由MOVDS, AX决定,而AX的值由MOV AX, DSEG决定,此时DS和AX的值均为DSEG段地址076A.

SS是堆栈寄存器。

CS的值由ASSUMECS: CSEG决定,CS为CSEG段地址076E。

IP为instruction pointer。

输入-d ds:0 ,可以看到当前内存情况。

数据段的ORG 10H使得数据块的起始地址从0010开始,所以第一行的值全是0.

从0010开始,VARB DB 'ABCDE’使得前五个数据分别对应ABCDE的十六进制ASCII码。

EVEN使得数据对齐。

VARW DW 3 DUP(5),4 DUP(-1) 生成了3个5和4个-1,占两个字节,高高低低存储。对应了05 00 05 00 05 00和FF FF FF FF FF FF FF FF。

VARD DD 1234H,5678H,3 DUP(5)生成了1234H、5678H,3个5,每个数据占4字节。高高低低存储。对应了34 12 00 00、78 56 00 00和3个05 00 00 00。


目录
相关文章
|
6月前
|
Windows
86/88汇编代码的运行调试
86/88汇编代码的运行调试
40 0
|
存储 安全 Java
JVM详解之:汇编角度理解本地变量的生命周期
JVM详解之:汇编角度理解本地变量的生命周期
JVM详解之:汇编角度理解本地变量的生命周期
|
Linux C语言 开发者
反汇编调试内核驱动 Oops提示【原创】
反汇编调试内核驱动 arm-none-linux-gnueabi-objdump -S kmod-demo1.o  > a.txt   什么是Oops?从语言学的角度说,Oops应该是一个拟声词。
1528 0
|
iOS开发 NoSQL C++
xcode反汇编调试iOS模拟器程序(五)调试objc_msgSend函数
反汇编调试objective-c,遇到最多的就是objc_msgSend这函数了,本节主要讲讲它的实现以及调试过程的一些技巧。 以UIWebView为例子,看看它在loadRequest时做了什么。
1264 0
|
iOS开发 编译器
xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量
引用第二节的例子: 函数的入口处,通常都是把esp的值传给ebp保存,然后下面的操作以ebp为基准做偏移量引用。因为esp作为栈指针,push和pop都会自动修改其值,所以用ebp可以不受影响。
814 0
|
iOS开发 编译器
xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编 - (void)test { UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.
916 0
|
C++ iOS开发 编译器
xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则
掌握了基本技巧后,基本上已不难理解所有的反汇编结果。授之以鱼不如授之以渔: 通过观察自己写的代码的反汇编来掌握各种代码的反汇编结果,从而逆向推测系统代码的源码。
1107 0
|
iOS开发 NoSQL API
xcode反汇编调试iOS模拟器程序(四)自动断点应用之NSNotificationCenter
知道怎么查看后,先看看有什么实际应用,拿NSNotificationCenter来做实践吧。 首先在某个容易进入的地方加断点,并停在那,例如main函数。
1154 0