汇编语言————实验1:搭建开发环境
阅读原文时间:2021年04月20日阅读:1

实验名称

搭建开发环境

实验目的

搭建汇编语言的开发环境,熟悉汇编程序开发的基本步骤,掌握基本的调试操作。

实验要求

基于VISUAL STUDIO 平台,结合MASM32的汇编器,构建IA-32汇编语言的开发环境。

实验内容

1、在VC6.0中搭建汇编开发环境

添加Irvine32.inc所在的目录到include files中

添加Irvine32.lib所在的目录到library files中

将masm32中的ml.exe和ml.err拷贝到VC的Microsoft visual studio\VC98\Bin目录中

配置project settings/Custom Build

2、编辑教材85页不带输出的程序:

.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
Rval  SDWORD  ?
Xval  SDWORD  26
Yval  SDWORD  30
Zval  SDWORD  40

.code
main PROC
       mov   ax,1000h
       inc   ax
       dec   ax

       mov   eax,Xval
       neg   eax
       mov   ebx,Yval
       sub   ebx,Zval
       add   eax,ebx
       mov   Rval,eax

       mov   cx,1
       sub   cx,1
       mov   ax,0FFFFh
       inc   ax

       mov   cx,0
       sub   cx,1
       mov   ax,7FFFh
       add   ax,2

       mov   al,0FFh
       add   al,1

       mov   al,+127
       add   al,1
       mov   al,-128
       sub   al,1

       INVOKE ExitProcess,0
main ENDP
END main

汇编与链接不带输出的加减法程序,输出结果

在程序最后加入调用DumpRegs过程的语句,以输出各寄存器的值

3、以单步执行的方式调试该程序,查看每步结果,并写成注释如下:

可以按下F10进行调试

4、添加解释说明的代码如下:

.386                                      ;表示这是一个32位程序,能访问32位寄存器和地址
.model flat,stdcall              ;说明程序的内存模式为平坦分段模式 子程序,并确定了子程序的调用规范为stdcall
.stack 4096                        ;运行时堆栈保存了4096字节的存储空间(一个物理页的大小(4kb))
ExitProcess proto,dwExitCode:dword  ;声明了ExitProcess函数的原型
include Irvine32.inc                ;引入文件Irvine32.inc

.data                ;定义数据段
Rval    SDWORD ?            ;定义有符号双字节数据(未初始化)
Xval    SDWORD 26          ;定义有符号双字节数据(初始化值为26)
Yval    SDWORD 30           ;定义有符号双字节数据(初始化值为30)
Zval    SDWORD 40           ;定义有符号双字节数据(初始化值为30)

.code               ;代码段
main PROC
     ;INC和DEC
mov        ax,1000h              ;ax=4096  将1000赋值给
inc        ax    ;1001h            ;ax=4097  将ax自增1
dec        ax    ;1000h           ;ax=4096   将ax自减1

;表达式
mov        eax,Xval              ;ax=26       将Xval的值赋给eax
neg        eax    ;-26              ;CF=1  AF=1 设置Carry Flag,取反操作,设置eax=-26
mov        ebx,Yval                ; bx= 30      将Yval的值赋给ebx
sub        ebx,Zval                ;bx=65526   CF=1  SF=1  eax-Zval
add        eax,ebx                  ;eax= 4294967260  ax= 65500   eax+ebx
mov        Rval,eax    ;-36     ;把eax的值赋给Rval

;零标志位实例
mov        cx,1                   ;cx=1  ZF=0  将1赋值给cx
sub        cx,1                     ;cx=0   ZF=1          将cx自减1
mov        ax,0FFFFh       ;ax=65535 ZF=1        将0FFFF赋值给ax
inc        ax                        ;ax=65535  ZF=1 AF=1  将ax自增1

;符号标志位实例
mov        cx,0                  ;cx=0      SF=0      将0赋值给cx
sub        cx,1                   ;cx=65535  SF=1  CF=1  AF=1将cx自减1   
mov        ax,7FFFh        ;ax=32767  SF=1      将7FFF赋值给ax
add     ax,2                      ;ax=32767  SF=1      将ax加2

;进位标志位

mov        al,0FFh                 ;al=255       CF=0  将0FF赋值给al
add     al,1                            ;al=0 ax=32512 CF=1  AF=1  将al加一

;溢出标志位

mov     al,+127                 ;al=127  OF=0 将127赋值给al
add     al,1                        ;al=128  OF=1  AF=1 将al自增1
mov        al,-128              ;al=128  OF=1  AF=1 将-128赋值给al
sub        al,1                     ;al=127  ax=32639  OF=1 AF=1 将al自减1
call DumpRegs               ;调用DumpRegs函数输出寄存器中的数值
INVOKE ExitProcess,0
main ENDP
END main
 

总结

对于汇编而言,学习搭建汇编开发的调试环境是非常重要的一件事情,同时对于一个学习汇编的程序员来说,代码的调试也是非常关键的,如果不进行代码调试,就不可能深入的理解到各个寄存器的工作原理,以及寄存器表现出的特征现象!

汇编还是非常有趣的,代码调试非常重要!

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章