搭建开发环境
搭建汇编语言的开发环境,熟悉汇编程序开发的基本步骤,掌握基本的调试操作。
基于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
对于汇编而言,学习搭建汇编开发的调试环境是非常重要的一件事情,同时对于一个学习汇编的程序员来说,代码的调试也是非常关键的,如果不进行代码调试,就不可能深入的理解到各个寄存器的工作原理,以及寄存器表现出的特征现象!
汇编还是非常有趣的,代码调试非常重要!