


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言学习笔记-傻瓜学汇编前言 当我在学汇编的时候发现一到了实际编程就发现学过的那些指令串不起来, 什么浮 点数啊整数啊, 怎么跳转啊, 怎么循环啊, 脑袋立马变成浆糊。 下面的文档是我的学习经历, 希望对初学者在学习加密解密,软件调试,单片机编程有点帮助。目录1. 编程环境的搭建2. 深入理解汇编语言的数据3. 顺序程序设计4. 分支结构程序设计5. 循环6. 数组及指针7. 函数8. 结构9. 综合运用10. 参考文献一:编程环境的搭建首先装好 masm32v10 和 windbg ,和 editplus ,然后在 editplus 中输入下面的程序, 具体 的请参考罗云彬的那本书,里面
2、有详尽的说明,编译运行看看:.386.model flat,stdcalloption casemap:none includelibmsvcrt.lib printf proto C :V ARARG.datamsg db "hello,this is the first test program!", 0dh ,0ah,0.codestart:call mainretmain procpush offset msgcall printfadd esp,4push offset msgcall printfadd esp,4retmainendp end start下面是
3、运行结果:- cmd to masm32.exet:>5Et i ncl ude-c :irasfn32i ncl ude;C iXProgram Fi 1 esMi crosoft Vi sual StudioyC38 Incl ude;C:PrcQram Fi 1 esli crosoft Visual StudioXVCaFCXlncl udeZ :>set 1 i b«c :jnasm32l i bZ :>set path=c:masm32Lir;c:orac1eora92bi n;C:Progrm Ft 1esOraclejrel.1*2 Khiri;C:
4、WINDOWSsyst®n32;C:WIMDOWS;匚:WIND0WS5vstem32Wbem;C:Program FilesCoFi 1 esVGTKX.OXbi n;C ;Program Fi 1 esAut)odEskDMG TrueVi ew;C :Program Fi 1 es bli crosoft SQL Server5OTool sbi nr;C :Program Fi 1 crooft Visual Stu di cCom pionTool sWi nNT;C iXProgram Fi 1 espii crosoft Vi sual 5tLidioCorTTnon&
5、#39;|1SDev98Bi n;C :P Mi crosoft Vi sual StudioCoirnioiiTQOl 5;C ;Proqram Fil esMi crosoft *i/i s lual StudioVC9Bbi n;D :StcrmIIGodec;D :StomiIIhrnonroQram Filest:>cd C:wbchlt亡 hl、makerlicrosoft E) Program Maintenance Uti 1 ity topyright j匚Microsoft Corp 1938-199E* Al 1Version 5.00.81630 rglrt弓 r
6、eserved*ml /nologo /c /coff /Zi test*asm Assembling: test»asmLink /nalogo /DEBUG /DEBJG7YPE:匚OFF/subeysteni:CONSOLE test.objt:vA,bchl>chl'chi1 i s no± rw匚ognized as an i nternal or external cotmand, pperable program or batch file.t :*/ybchl>t e stlie! Io,thi s i s the first test
7、program' he!ldjthis is the first test prgramf这里输出两行消息主要是我在写这个最简单的程序的时候发现他不换行,于是我在数据定义后面我加了“ Oah, Odh,呵呵,就是回车换行的十六进制表示,你也可以用其他方法试试, 程序就不多解释了,后面会有更多的解释,不过你一定要走到这以步,才能进行下一章。2深入理解汇编语言的数据整数常量及变量,先看一段很简单的汇编程序:.386.model flat,stdcallopti on casemap:nonein cludelibmsvcrt.libprintf proto C :V ARARG.dataP
8、RICE EQU 30 msg1 db "total=%d",0dh,0ah,0 .codestart:call mainretmain proclocal num:dword local total:dwordmov num,10 mov eax,numimul eax,eax,PRICE mov total,eaxpush offset msg1 call printf add esp,4 retmain endp end start程序的意思很简单就是在屏幕上打印出某个东西的价格, 如过要你拿笔和纸算, 拿你肯定很 快就能算出来,但你让电脑怎么算呢?当电脑执行到第一个
9、语句的时候,也就是num=10 ,它就把 10 放到某个地方并且记住这个值,存放器或者内存,呵呵,它也就这两个地方,为 什么要这么做呢?因为后面要用它来计算啊, 为了算出这个值, 电脑好的方法就是放在它的 内存里,为什么不是存放器?因为存放器太少了,就那么几个,呵呵,所以了它就把 10 存 在一个叫 num 的内存里,注意了哦, num 是程序里的变量名,是存中里的一个位置的名称, 它的值是 10,你可能会问,不起名不行么?行,等下在调试器中你看到的就是没名的。来 看看它在调试器中的样子:num变成了 ebp-4 了,现在你想象有个几千行的程序如果都用ebp-4这样的名字的话,那我们会疯的,所
10、以汇编程序就让我们给程序里面的变量起个直观的名字,而不是用具体的数字去让你去记住变量内存的位置。程序中 imul eax,eax,1eh中的1eh就是个整形常量,也就是 30.现在你应该对常量和变量有点感觉了吧。再看个例子:.386.model flat,stdcallopti on casemap:nonein cludelib msvcrt.libprintf proto C :VARARG.dataadb12hbdw1234hc1dd12345678hmsg1db "the number is=%xh",0dh,0ah,0.code start:call mainre
11、tmain procmov al,a cbw cwde push eax push offset msg1 call printf add esp,8movax,word ptr acwde push eax push offset msg1 call printf add esp,8moveax,dword ptr apush eax push offset msg1 call printf add sp,8ret main endp end start12 12 34 12 34 56 78 ,首先,你得想 a,b, c1 三个变量在程序中到底是怎么存的,是 还是 78 56 34 12
12、34 12 12 呢?呵呵,用调试器载入程序看看就知道了:哈哈,看到了没,正确的选项是这个:00403000: 12 34 12 78 56 34 12 74-68,这是为什么?还有就是这个程序打印的三个结果又是什么呢?是12h和0012h和00000012h吗?如果是,呵呵,首先,你得明白这三个你定义的数据在内存是怎么存的,一个原那么就是你定义的数据的高位存在内存中的高字节地址,你定义的第二个数据:1234h,高位字节是12吧,低位字节是34吧,所以编译器它先存34字节存在内存的低地址,然后再把12存在高地址,当然如果是你只定义了一个字节那顺序就没反了,就像你定义的第一个字节数据12好一样,
13、同样第三个双自数据12345678h,编译器它就先存78好字节了,然后是56好字节,34h字节, 12h字节。下面我们来看看程序:moval, a,就是是把12h放到al中,movzx ax, al 0扩展指令,将al中的字节扩展到ax中,缺乏的位用 0填充,不改变al的值,al里面是什么值,扩展后ax的值还是等于al中的值。 movzx eax,ax;0扩展指令,将 ax中的字节扩展到 eax中,缺乏的位用 0填充,不改变ax的值,al里面是什么值,扩展后eax的值还是等于 ax中的值。然后pusheax,和push offset msg1, call printf就是调用c语言库函数 pr
14、intf打印消息, 就相当于c语言里面的:printf("thenumber is=%xhn",a);下面的和这段一样,我就不写废话了。如果面对的是有符号数,那就得用movsx 了,当然还有其他指令,后面再介绍。浮点数:在计算机内部,浮点数是以二进制表示的,所以,要先转换为二进制浮点数,转换分两部,整数局部的装换,采用“除2取余法,小数局部的装换,采用“乘2取整法,例如19.2,先将19转换成二进制:10011,然后将0.2转换成二进制:001100110011,它是个无穷 循环小数,然后就是规格化,分三种情况:如果定义的数据类型是dword或者是real4,那么符号位占一
15、位,阶码占 8位,位数占23位,总共是32位,如果定义的类型是 qword或real8,那么符号位占一位,阶码占11位,位数占52位,总共64位,如果定义的类型是 reallO 或者是 tword ,那么阶码占 15 位,位数占 64位,符号位占一位,总共 80 位。怎么算阶码 呢?如果是32位,就将阶码加上127,然后转换成二进制,如果是 64位,就加上1023,如 果是80位,就加上16383。我们看看怎么将19.2转换成32位的二进制浮点数:首先将19转换成二进制:10011,然后将0.2转换成二进制:001100110011,整理成32 位 就 是 :10011 ,。 然 后 规 格
16、化 为 :1 ,的 4 次方,阶码为 127 加 4 等于 131: 10000011。所 以当浮点数 19.2 表示为三种不同的数据类型为:32 位( dword , real4): 0, 10000011, 64 位 ( qword , real8 ):0,80位:0,。转换成 16进制就是 4199999Ah, 40333333 33333333 h, 403999999999999999ah。 然后我们 yong 程序来验证一下对不对。例子如下:.386.model flat,stdcalloption casemap:noneincludelibmsvcrt.libprintfpro
17、to C :V ARARG.dataf1 real419.2f2 real819.2f3 real10 19.2msg1db "the floating number is=%g",0dh,0ah,0.codestart:call main retmain proclocal f:real8fld dword ptr f1 fstp fpush dword ptr f+4 push dword ptr f+8push offset msg1call printfadd esp,12push dword ptr f2+4push dword ptr f2push dword
18、ptr offset msgl call printfadd esp,12fld f3fstp qword ptr fpush dword ptr f+4push dword ptr f+8push offset msglcall printfadd esp,12retmainendpend start程序很简单,就是分别在屏幕上打印三个浮点值,如下列图:* cmd to masm32keMe七h雯 floati ng number i s-19.2the f loati rig number* i s = 19.2the float! ng nLimber i s.«19.2c :
19、 vA,bc h 2ch2 - 2 > nmak tMicrosoft 町 Program Maintenance U111ity Version S.00.8168.0 Copyright fCj MicroscrFt Corp 1983-1998* Al 1 rights reserved.ml /c /kci幵 fZ. ch2-2*asmMi csoft (R) Mac0 AsscmLl er Version 6»14, S444popyright Microscrft Corp 1981-1997. Al 1 rglrts rescrved.Assembling:亡h2
20、-2.asmLink /DEBUG /debugtype:COFF /subsystemICONSOLE ch2-2.objMi crosoft E Incremental Li nker Version 5,12.8078Copyright Microsof Corp 1592-199E* Al 1 rights reserved.|C :wbch2ch2-2>nmakeriicrosoft (R) Program Maintenance Uti 11ty fcopyright l匚j Microsoft 匚crp 1988-1996. Al 1匚h2-2.exe1 is up-to-
21、dateIl ! wbe h 2c h 2 - 2 > nmak &l*1i(R) ProgMai riteriance Utl 11tyKjopyright Microsoft 匚orp 1988-1996* Al 1Version 5.C0,813.0 riqhts reserved.Version G00.816S rights reserved*匚h2-2.exe1 is up-to-date匚亡亠the floating number 1s-192 the fIcating number i-2 the floating number i s=19.2 在这里我要说明下
22、,我只有把 32位和 80位的转换为 64 位的,才能打印成功,这可能是库 函数 printf 的原因,怎么转换呢?32位浮点转换 64位浮点:首先得借助一个 64 位的浮点局部变量:localf:real8flddword ptr f1fstpf第一句定义了 f 位一个 64 位的浮点局部变量,第二句就是把 32 位浮点数转换为 80 位的, 然后第三句就是把 80位的转换位 64 位的。80 位浮点转换位 64位浮点数:同样借助一个 64 位的浮点局部变量:fldf3fstpqword ptr f第二句就是把 80 位的浮点转换位 60 位的。但是这两句怎么解释呢: pushdword p
23、tr f2+4pushdword ptr f2为什么要先把 f2 的高 4 位字节入栈呢?好,我们先来看看这个数转换成64位的16进制为:40333333 33333333h,前面我说了上下对应原那么,那么这个 64位的16进制在内存中高 4字节地址应该存 40333333h,也就是存它 的高4字节,然后是33333333h,但是,呵呵,在堆栈中的地址是从高往低增长的,所以我 们应该先把这个数的高四字节入栈,也就是40333333h,怎么在内存中得到这高4字节呢?就是从f2+4处压入4字节就可以了,然后就是低4字节入栈。如果还没理解,用cdb调试一下就清楚了。浮点与整数之间的转换:先看例子成
24、ch2-4:.386.model flat,stdcalloption casemap:noneincludelibmsvcrt.libprintf proto C :V ARARG.dataf1 real819.2f2 dword 20msg1 db "the floating to int number is=%d",0dh,0ah,0msg2 db "the int to floating number is=%f",0dh,0ah,0.codestart:call mainretmain proclocal f:real8 fld f1 fist
25、p dword ptr f push dword ptr f push offset msg1 call printf add esp,8fild f2 fstp fpush dword ptr f+4 push dword ptr f+8 push offset msg2 call printf add esp,12retmainendp end start 运行结果为:eEA : wb' ;ch?cli2-4:'nrTiah etrosoft: (E) ProQrani M41 ntenri匚亡 Cti 11 "tyCopyright fcj Microsoft
26、匚dr口 19&4199E. Al 1Version G.CQ13.0 riqht5 reserved.'亡h2-4.exe1 is up-to-date*1icrosoft (R) Program Maintenari匚已 Utility Icopyright (匚j Microsoft Corp 1908-1998. Al 1Version E00-S16S»O vights reserved*'匚h2-4.exe' is up-to-dateIC :s.iubuh21 ch2-4.nrnak emi crusoft (R) Program Mai
27、'ltenarice Utilitycopyright CC) M-icroso-fH: Corp 1508-1998, Al 1Version 6.00.E168.O rights reserved*'ch2-4, ex&' i s up-to-daLtet s;wbc h 2ch2 -4 > nmak e*li crosoft R) Program Maintenance Uti 1' ty Icopy-ight (C) Mlcrosoft Corp 19E8-1998* Al 1Version 6.00.8168.0 rights raser
28、ved.'ch24 + exe' is up-to-dateBe : VAbc:h2*匚 h2-4:计limb eflicrosoft (R) Program Maintenance Uti1ity (Copy"ight (Cj Microoft Corp l!r8B-1998» Al 1Version &00.81630 r1ghts res亡rv亡U-'ch2-4 + exe * is up-to-date|C :wLch2ch2'-4>ch2-4the f lcati ng to i nt n Limb er i s=19
29、(the i nt to float!nq number 15=20.000000" emd to ma5m32.exe浮点数转换成整数:flfldfistp word ptr f首先我们还是借助了一个64位的局部变量,先把浮点数装入浮点存放器,然后用装换整行的指令变成整数再存入一个局部变量就行了。整数转换成浮点数:fild f2fstp f先把整数用装换指令装入浮点存放器,然后把浮点数存到一个局部变量就可以了。 我在后面会详细说名浮点数的运算和浮点存放器的。字符与字符串常量: 怎么定义他们?他们是以什么形式存在计算机中?首先我们怎么在汇编中定义他们呢:先看看例子ch2-5 :.mo
30、del flat,stdcall opti on casemap:none in cludelibmsvcrt.libprintfproto C :V ARARG.datastr1 db'this is a string test',0ah,0dh,0str2 db"this is a string test",0ah,0dh,0.codestart:call main retmain procmov eax, offset str1push offset str2call printfadd esp,4push offset str1call printf
31、add esp,4ret mainendp end start 程序就是在屏幕上打印两行消息,下面是运行结果:1-1 口卜" cmd to ma5m32.exet:>set i ncl ude=c :ma5m3 2i ncl udl&C :Program F i 1 esMi crosoft Vi sual Studi oVC98 Incl ude;C :PrQflram Fi 1 crosoft Vi sual StudiQXVCSSFCXlncl udep :>set 1 i b- c; nia5iTi3 2 i bk:>set path = c:ma5
32、m3?Li r;c:orac1eora92bi n;C:Progrm Ft 1 es0raclejrel1* ? Kbin;C: WI MDOWSey stem32;C : WI MDOWS;匚:WI NDOWSSy st em3 2Wb em;C:P roqram File eCo hmor Fi 1 esGTK2*Otji n;C :Program File5Autcde5kxyDWG TrueVi ew; C :Program Fi 1 es rli crosoft SQL ScrvepMTool sbi rw;C iProgram Fi 1 esMi crosoft Vi sul St
33、udioCotn monTool sWi nNT;C :Pncigram Fi 1 esli crosoft Vi sual StuclioCoiTmonVlSDev98Bi n;C :P roqr arn l-i 1 es'Ai zrTiscitt Vi sua' tudn3i.cirTTnz n' luul s; t. : Pr 3 qrar'i I-1 1 es 1 nr_c sott J1 s lial StudioVC9ebin;D:StcrmIIGodec;D:StDrihII|c :>cd C : wt*cli2ch2-5t:nbc h2ch
34、2-5 > nmak trlicrosoft E Program Maintenance Uti1ity Version 6,00-S168»O topyright Jcj Microsof± Corp 1988-1998* Al 1 rights reserved.|ml /nologo /c /coff /Zi ch2-5.asmAss亡mbling:ch2-5»asmLink /nolo go /DEBUG /DEB;JG7YPE :COFF /subsystem :CONSOLE ch2-5.obj|c :vA,bch2ch2- 5>ch2-5
35、thi5 is a stHng test rthi 5 i s a stri ng test 匕:叭匕心吃匸h2-5>然后我们用cdb调试器看看定义的那两个字符串变量在内存中到底是怎么样的:cmdl to cdb.exe - edb -2 C:wblch2k:h2-5U:h2-5Executable search ModLoad: ModLoad: ModLo!ad: ModLoad:OOOC'OOO 7C9O0OOO800000 和匚10000path 1 00404000 7c9b2000 7c&fSOOO 77c68OOOntdl1< dl1C :WlND0W
36、S5yEtem32kernel32r dl 1C:WINDOWSsy5tem32M5VCRT,dl1ex匚eption - code 80000003 (fi rst 匚hance)(d68»2e8) : Break i fist ruction pax=00251eb4 ebx=7ffdaDDD eex=00000004 edx=00000010 esi=OO251f48 edi =<»251eb4 ei p=7匚2D120e: esp=0013fb20 ebp=0C|13f 匚孕4 i opl =0nv up ei pl mz na po nccs=Q01b 55
37、=0023 dls=OO23 es=0023 fs=O03b gs=0000efl =00000202* ERROR: Syrnbsl file could not be found, Defaulted to expert symbolfor ntdl 1 .dll ntdl1IDbgBreakPoi nrtt s 7c9012Oe cc 0:000> g ©-Jexentry ModLoad: ScbZOOOO 5cb$6OOO C :WlND(HiS5ystem3 2Shiim£ng . dl 1 eax=0CXXX)Q00 ebx=7ffdatXJQ 已匚x=
38、0013ffb0 edx=7c90e514 esi =00000000 edi =00000000 ei p =00401000 esp=O013ffc4 ebp=0013fff0 wpl =0nv up ei pl zr na pe nccs=Q01b 55=0023ds23 es=OO23 fs=O03b g 5 =0000efl =00000246WARN!NG: Unabl e to verify 匚hecksmn for ch2-5已址亡 匚h2_5I start: 00401000 e801000000 0 S000> t eax-CXXXXXJOO ebx-7ffd
39、1;000 ecx-0013ffbO edx-7c90e514 esi-00000000 edi-00000000 ei p-00401006 esp-0013ffcO ebp-OOilfffO iopl «0nv up ei pl zr pe ri匚亡OOlbd雪±0023 es=OO23 fsOOSb g5 =0000efl 00000246匚 h2_5 !mai n : 00401006b800304000i ntcal 1mzivch?_5imain 00401006)eax,offset 匚h2_51_NULL_IMPQRT_DESCRIPTDR+OxfS8 (0
40、003000)0 :000> d004030000040301000403020004030300040304000400040306000403070 b:ooo>O 6 6 7 0 0 0 0 0O0840000003 67200 0 00 O440100000 2600000Oy 5 3 0 0 0 0 074 00 00 00000069 730a Od69 e00 0000 0000 0000 0000 0020-61 Q0«746-20 00-00 00-0000-0000-0000-007369 6号000000DQ007473730000000000722
41、0740000000000696769 73 20g Od 0000 00 0000 00 0000 00 0000 OO 0000 OO 00thi s 1 5 a stringtestB»thi s i s已 stri ngi t电晉t. 恩,它们是以asii码的形式存在的。其他的数据类型我会在下面的各个章节会随着编程的算法和调试一起讲解。3:顺序程序设计汇编语言的顺序编程比拟好理解,就是在编程的时候没有跳转,没有循环,看看例子ch3-1 :例ch3-1 :输入三角形的边长,求三角形的面积。我假设输入的三边长都是能构成三角形的,求三角形面积的公式为area= ss-a s-b s
42、-c。s= a+b+c /2.这里要用到浮点指令,那就先回忆下浮点指令的用法:这里要加减乘除和平方根五种指令,由于In tel的浮点数据存放器是种堆栈结构,我们要记住这一点。先看看数据传送指令:fld和fild,fst,fstp :fld源操作数,源操作数可以是浮点存放器和内存,这个指令主要是把源操作数压入浮点寄存器堆栈其实就是 stO,如果源操作数是整数,那就用fild。Fst和fstp是把st 0浮点存放器中的数弹出到目的操作数中,目的操作数可以为浮点存放器和内存。加减法指令:fadd, faddp,fub,fsubp第一种形式:fadd目的操作数,源操作数。其中目的操作数,源操作数可以为
43、浮点存放器 和内存。第二种形式:fadd源操作数,我本人比拟喜欢这种,它不会把我脑海里的浮点存放器的顺序弄乱,这种形式的源操作数只能是内存。减法指令同加法指令,就不多说了。乘除法指令:fmul,fdiv 浮点的乘除法是不区分有符号和无符号数的,他们也有两种形式:fmul 目的操作数, 源操作数 和 fmul 源操作数这两种形式, 第一种 操作数和源操作数可以 为浮点存放器和内存,但第二种 源操作数 值能为内存。平方根指令: fsqrt 这个指令就一种形式就是 fsqrt ,就是把第 0 个浮点存放器 st0 的值变成平方根值然后存在 st0 中。再回到例题中,我们应该先算s 值,然后再算平方根
44、下面的值然后求平方根就行了。S值是三边长除以2,转换成浮点指令就是:fid a ;先把a值放到浮点存放器 sto中 再就是 fadd b ;这个就是a+b,结果存在 sto中 然后 fadd c ;同上,结果存在 sto 中 现在算出了三边长的和,在除以2就ok 了 fiv two ;结果在sto中,最后把sto里面的值用fstp s存到s中就把s值算出来了。 再来算根号下面的值,这里有乘法和减法,我们先算减法:fid sfsub,a;这个就是 s-a,结果在 sto 里再fid sfsub b ;这个结果还是在sto 里,但是上面那个 s-a 已经被推到 st1这个浮点堆栈了啊,记住了。再f
45、id sfsub c ;这个结果还是在sto 里,那么s-a被推到st2 了,s-b 被推到 st1了,s-c的值在st0中,这里千万不能及乱了啊,下一步算乘法,先算s* s-c,mul s;果在 stOlifmui sto , st 1这一.【匕曰咎* 步是算s* s-a * s-b最后算 s* s-a * s-b * s-afmul st o, st 2,然后把 s* s-a* s-b*s-a的结果再求平方根fsqrt再把这个平方根的值弹出到area 中。这是按照上面的想法写出的程序:.386.modei fiat,stdcaiioption casemap:noneinciudeiibm
46、svcrt.iibprintfproto C :V ARARGscanfproto C :V ARARG.datamsg1db "%f,%f,%f",omsg2db "area=%7.2f",oah,odh,omsg3db "piease input three fioating numbers",oah,odh,otwo reai42.o.codestart:call main ret main proclocal a:real4local b:real4local c1:real4 local s:real4 local area
47、:real8pushoffset msg3 call printf add esp,4lea eax,c1 pusheax lea eax,b pusheax lea eax,a pusheaxpushoffset msg1 call scanf add esp,16fld afadd bfadd c1 fdiv two fstp sfsub afsub bfsub c1fmul sfmul st,st(1)fmul st,st(2) fsqrt fstp areapushdword ptr area+8 pushdword ptr area+4 pushoffset msg2call pri
48、ntf add esp,12 retmainendpend start编译运行:下面是结果:cmd to masm32.exeI,r * 2area=l334»O2t;vAtch3c h3-1> nmaket: vA,tic h 3th3nmak e:yub匸:vA.tit h 3th3-l>ch3-lIplinput three float!ng 3,4,6 lar«a=163B4.O21 chj-l.exe115 up-ta-dat亡ml /nologo /c /coff Assembl i ng t ch3-l»astnLi nk /nologo
49、 /DEBUGAssembli ng r ch3-1.asmLink /nclogo /tEEUG /DEBDGTYPE:COFFt:wbch3ch3-l>£h3-2'ch3 -2 ' i s nut reuuLjni zed .is an i nternal or pperable program or batch fileC jyAt|ch3ch3-l>ch3-lplease i npu t three fl oat i rifl numbersMicrcsoft (R) Program rtenan匚e Utility topyr"ight
50、 卍j Microsoft Corp 19SB-1998. Al 1t:*ALch3ch3-l>ch3-lpl ease i nput three f loacti ng numberw 3.0,4.0,5»0area-16384.02Microsoft CR) Progratn ritenan匚已 Utility Icopyri ght Q'C) Mi crosoft Corp 1988-1998, Al 1/Zi ch3-l.asm/DEBUG7YPE:匚OFFnumbersexternal ccrrmand,Version 6.00«818.0 righ
51、ts reserved.Version 5.00.E168.0 rglrts reserved*/subsystem:匚ON5OLE:匚hl-l.obj/suLsystem:CONSDLE ch3-l,obj但是出乎意料哦,错了,怎么办呢?你发现什么问题了没?那只有调试看看了,用cdb -2 C:wbch3ch3-1ch3-1翻开程序然后逐步调试看看,当跟踪到下面这句是就发现 有问题了:駅 emd to cdb.exefpcw»027F: rn 53 puozdi psw"36DD: top»7 cc»OOOO fopcDde-0007 fpip-OOl
52、b:OO4O1038 fpdp-0023:0013ffbO'_stl- O.061356396932S£3ie310e+32O95t3=-0.0664547755543 3 2B2B220e-b4184 st5 = -0.0005 7309713 65 25 B67540e-h4in st 7= Q. O0175 7713 6705495 3 5 240 e-K?864efI=00000202fptw»3FFFPIsto- 1 * 300000000000000000000e+0001 5tz= 0,OOOQOOOOOOOOOOOOO14 ?Q e+04 7 6 s
53、t4=-0.000874475265931O47610e+4166 st6= 0.00052228317O297O92O0e+3867 ch3_l !rr ai n+Ox3 5 :D04OlO3b d8353c304000 fdivds:0023:0040303匚=40000000dwordptr ch3_1 ?_NULL_IMPORT_DESCRIPTOR-K)xfc4 (O0KBO?ID :QQO>fiax-DOWOOOB«cx-?c41a54eiP4D40W4L esp-0013ffa4 ebp-0013ffbe55=0023fs-003bIfpcw=O27F: rn 5
54、3 puozdi fpsw=3 8OO 3 top=?匚匚=0000 一 ffopcode=OO07 fpip=001b :0040W3b fpdp=O023 =0040303 匚edx=77匚 15讪0 £51 -00000000 edi-00000000ioplnv up ei pl riz 114 po ncgs=0000efl-00000202fptw=3FFr6.5Q0000OC'0OOOO0OOOQOOOeD0000. OOOOOOOOOOOOOCXX»14 70 *4 7 6 -0.000874475265931D47610e41661 >mai
55、 n-hDx3b :st0st 2st4st 6chj._00401011 d95dfO0;000>eax"00000003 ebx"?ffdeODO ecx»?c41a54 ei p-0(M01044 esp=0013f f ebp=0O13ff t)c CS=(X)lb S3 =00 2 3 ds=aO23fstp 00175 77136705495 3 5 240e-m=864dwsrdptr gbp-10h ss:OO23:0013ffe4SdOedx»77t61b60 esi "DOODOOoO edMOOOOOOOOiopl
56、>=0nv up ei pl nz na po n匚&5=0023 fsQOJb 2=0000efl =00000202fptw=FFFFfp匚w=027F: rn 53 puozdi fpsw=0000: top=0 匸匚=0000 - fop匚ode=0007 fpi p=O01t =00401041 fpdp=0023 :0013ffa匚 sW= 0.0613 5 63 96493 2863 18310e+3 209 st2 = -0.066454775 5 543 3 2828220e-r4184 st4=-0.0005730971365Z5867540e+4171 st6= 00017577136?O5495?5240e+O864 ch 1'main+OxBe;00401044 0 :000> q quit;stl= O OOCiijijOOOOOOOODOOO 14 70 e-K3476 s±3 = -0 0008 744 75 265 9 3104 7 610 e-M 166 srt5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年风力发电场建设对地方产业结构优化的社会稳定风险评估报告
- 中心静脉导管护理培训
- 2021-2026年中国速冻包子市场深度分析及投资战略咨询报告
- 中国型模及金属铸造用型箱行业发展前景预测及投资战略研究报告
- 数学一班级上册教学方案
- 连锁企业人员招聘方案
- 2021-2026年中国汽车典当市场竞争态势及投资战略规划研究报告
- 电子商务活动方案模板
- 2025-2031年中国冶金矿山专用阀门行业发展前景预测及投资方向研究报告
- 学校创新活动方案
- 初中数学培优补差总结3篇
- 飞书项目管理
- (中级)数据安全管理员(四级)职业技能鉴定考试题库-中(多选、判断题)
- 第五届应急管理普法知识竞赛考试题库500题(含答案)
- 2024年计算机软件水平考试-初级信息处理技术员考试近5年真题附答案
- 尼康-D300S-相机说明书
- 酒水饮料运输协议模板
- DB3401T 218-2021 芡实米加工技术规程
- TSDDP 8-2024 新型无机磨石施工质量与验收规范
- 钢结构雨棚施工承包合同
- 劳动合同模板纸打印
评论
0/150
提交评论