﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天下-随笔分类-汇编语言</title><link>http://www.cppblog.com/aaxron/category/18044.html</link><description>程序,一个重要的起点,启点,旁支.</description><language>zh-cn</language><lastBuildDate>Fri, 01 Mar 2013 12:44:28 GMT</lastBuildDate><pubDate>Fri, 01 Mar 2013 12:44:28 GMT</pubDate><ttl>60</ttl><item><title>C++整数、浮点数、结构体的返回值</title><link>http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 01 Mar 2013 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198151.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198151.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198151.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><br /><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sex;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;name[</span><span style="color: #000000">20</span><span style="color: #000000">];<br />};<br /><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;GetPerson(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sex,</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;name)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;p.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />&nbsp;&nbsp;&nbsp;&nbsp;p.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(p.name,name);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p;<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x7ffff123</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x7ffff456</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x7fffffff</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">汇编指令:imul,mul</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">)(m&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;n);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后强制转换为long&nbsp;long,最后赋值给x,</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">)m&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;long&nbsp;long,然后赋值给y,注意强制类型转换括号的位置,</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后赋值给x.</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;004114BC&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[m]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114BF&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[n]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114C3&nbsp;&nbsp;cdq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据扩展指令，将双字数据扩展为四字类型<br />&nbsp;&nbsp;&nbsp;&nbsp;//CDQ&#8212;Convert&nbsp;Double&nbsp;to&nbsp;Quad&nbsp;(386+)，该指令把edx扩展为eax的高位，也就是说变为64位。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114C4&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[z],eax&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114C7&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-4Ch],edx&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">m&nbsp;=&nbsp;%d,n&nbsp;=&nbsp;%d&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">,m,n);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">x&nbsp;=&nbsp;%lld\n</span><span style="color: #000000">"</span><span style="color: #000000">,x);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">y&nbsp;=&nbsp;%lld\n</span><span style="color: #000000">"</span><span style="color: #000000">,y);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">z&nbsp;=&nbsp;%lld\n</span><span style="color: #000000">"</span><span style="color: #000000">,z);<br /><br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m1</span><span style="color: #000000">/</span><span style="color: #000000">n1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m1</span><span style="color: #000000">/</span><span style="color: #000000">n1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后赋值给k2,汇编指令:idiv</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;0041155E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[m1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411561&nbsp;&nbsp;cdq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411562&nbsp;&nbsp;idiv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[n1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411565&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h],eax&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041156B&nbsp;&nbsp;fild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411571&nbsp;&nbsp;fstp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qword&nbsp;ptr&nbsp;[k2]&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fild和fstp都是x87指令&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fild浮点加载整数&nbsp;然后转换为长双精度&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fild是将整数转化为长双精FP80压栈（压到st0）,<br />&nbsp;&nbsp;&nbsp;&nbsp;fstp是将弹栈指令，将st0弹出。<br /><br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">double</span><span style="color: #000000">)(m1</span><span style="color: #000000">/</span><span style="color: #000000">n1);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后强制转换为double,最后赋值给k3,汇编指令:idiv</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">double</span><span style="color: #000000">)m1</span><span style="color: #000000">/</span><span style="color: #000000">n1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为double,然后赋值给k4,注意强制类型转换括号的位置,汇编指令:fidiv</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;00411590&nbsp;&nbsp;fild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[m1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411593&nbsp;&nbsp;fidiv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[n1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411596&nbsp;&nbsp;fstp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qword&nbsp;ptr&nbsp;[k4]&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k1=%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k1);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k2=%f&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k2);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k3=%f&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k3);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k4=%f&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k4);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">127</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;l2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">122</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;l3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l2;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;0041162E&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,byte&nbsp;ptr&nbsp;[l1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411635&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,byte&nbsp;ptr&nbsp;[l2]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041163C&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041163F&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[l3],eax&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;l4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l2;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;00411645&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,byte&nbsp;ptr&nbsp;[l1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041164C&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,byte&nbsp;ptr&nbsp;[l2]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411653&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411656&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;ptr&nbsp;[l4],al&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">/</span><span style="color: #000000">l2;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l6&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">(l1)</span><span style="color: #000000">/</span><span style="color: #000000">l2;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l2;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;004116A6&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,byte&nbsp;ptr&nbsp;[l1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116AD&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,byte&nbsp;ptr&nbsp;[l2]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116B4&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116B7&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h],eax&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116BD&nbsp;&nbsp;fild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116C3&nbsp;&nbsp;fstp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qword&nbsp;ptr&nbsp;[k5]&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">l3=%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,l3);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">l4=%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,l4);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k4=%lf&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k5);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;o1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0xff34567812345677</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;o2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0xab34567834125615</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;o3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;o1&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;o2;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">溢出</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;name[</span><span style="color: #000000">20</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Aaron</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Aaron</span><span style="color: #000000">"</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p2;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">p1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pp2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">p2;<br />&nbsp;&nbsp;&nbsp;&nbsp;p2</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p1;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />汇编指令:<br />00414348&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,7&nbsp;<br />0041434D&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,[ebp-188h]&nbsp;<br />00414353&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,[ebp-1ACh]&nbsp;<br />00414359&nbsp;&nbsp;rep&nbsp;movs&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;es:[edi],dword&nbsp;ptr&nbsp;[esi]&nbsp;<br /><br />//ecx&nbsp;是计数器(counter)，是重复(REP)前缀指令和LOOP指令的内定计数器。<br />因为sizeof(person)&nbsp;=&nbsp;28,所以才有mov&nbsp;ecx,7&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p3;<br />&nbsp;&nbsp;&nbsp;&nbsp;p3</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetPerson(age,sex,name);<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">结论:</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />整数类型:<br />&nbsp;&nbsp;&nbsp;&nbsp;小于等于4字节的返回值放在eax中,<br />&nbsp;&nbsp;&nbsp;&nbsp;8字节的返回值放在edx&nbsp;+&nbsp;eax中,其中edx为高位,eax为低位.<br /><br />浮点数类型:<br />计算是通过压栈的方式,如汇编指令:fild<br />返回是通过出栈的方式,如汇编指令:fstp<br /><br />结构体类型赋值:<br />是通过内存拷贝的方式,如汇编指令:rep&nbsp;movs<br />将源值的地址放入esi,<br />将目标值的地址放入edi,<br /><br />00414393&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,[ebp-2D8h]&nbsp;<br />00414399&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,[ebp-1D0h]&nbsp;<br />0041439F&nbsp;&nbsp;rep&nbsp;movs&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;es:[edi],dword&nbsp;ptr&nbsp;[esi]&nbsp;<br /><br /><br /><font color="#008000">结构体类型</font>返回值:<br />通过eax将结构体的<font color="#008000">指针</font>返回<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000">"</span><span style="color: #000000">pause</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #008000">//</span><span style="color: #008000">111111111111111111111111111111<br /></span><span style="color: #008000">//</span><span style="color: #008000">00000000000000000000000000000001<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">111111111111111111001010111100<br /></span><span style="color: #008000">//</span><span style="color: #008000">10000000101011010101110111000010<br /></span><span style="color: #008000">//</span><span style="color: #008000">取反加一&nbsp;1111111010100101010001000111110<br /></span><span style="color: #008000">//</span><span style="color: #008000">11111001111111111111111111111110000011000<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">11111111111111111111110000011000<br /></span><span style="color: #008000">//</span><span style="color: #008000">1111101000<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">11111010000000000000000000000000000000000&nbsp;=&nbsp;0<br /></span><span style="color: #008000">//</span><span style="color: #008000">00000000000000000000000000000000<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">1111111111111111111110000011000</span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/aaxron/aggbug/198151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-01 10:16 <a href="http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CPU时钟周期</title><link>http://www.cppblog.com/aaxron/archive/2011/11/17/160316.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 17 Nov 2011 02:08:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/17/160316.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/160316.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/17/160316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/160316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/160316.html</trackback:ping><description><![CDATA[<div><div><span style="white-space:pre">	</span>在电子技术中，脉冲信号是一个按一定电压幅度，一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期；而将在单位时间（如1秒）内所产生的脉冲个数称为频率。频率是描述周期性循环信号（包括脉冲信号）在单位时间内所出现的脉冲数量多少的计量名称；频率的标准计量单位是Hz（赫）。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。频率在数学表达式中用&#8220;f&#8221;表示，其相应的单位有：Hz（赫）、kHz（千赫）、MHz（兆赫）、GHz（吉赫）。其中1GHz=1000MHz，1MHz=1000kHz，1kHz=1000Hz。计算脉冲信号周期的时间单位及相应的换算关系是：s（秒）、ms（毫秒）、&#956;s（微秒）、ns（纳秒），其中：1s=1000ms，1 ms=1000&#956;s，1&#956;s=1000ns。</div><div></div><div>　　CPU的主频，即CPU内核工作的时钟频率（CPU Clock Speed）。通常所说的某某CPU是多少兆赫的，而这个多少兆赫就是&#8220;CPU的主频&#8221;。很多人认为CPU的主频就是其运行速度，其实不然。CPU的主频表示在CPU内数字脉冲信号震荡的速度，与CPU实际的运算能力并没有直接关系。主频和实际的运算速度存在一定的关系，但目前还没有一个确定的公式能够定量两者的数值关系，因为CPU的运算速度还要看CPU的流水线的各方面的性能指标（缓存、指令集，CPU的位数等等）。由于主频并不直接代表运算速度，所以在一定情况下，很可能会出现主频较高的CPU实际运算速度较低的现象。比如AMD公司的AthlonXP系列CPU大多都能已较低的主频，达到英特尔公司的Pentium 4系列CPU较高主频的CPU性能，所以AthlonXP系列CPU才以PR值的方式来命名。因此主频仅是CPU性能表现的一个方面，而不代表CPU的整体性能。</div><div></div><div>　　CPU的主频不代表CPU的速度，但提高主频对于提高CPU运算速度却是至关重要的。举个例子来说，假设某个CPU在一个时钟周期内执行一条运算指令，那么当CPU运行在100MHz主频时，将比它运行在50MHz主频时速度快一倍。因为100MHz的时钟周期比50MHz的时钟周期占用时间减少了一半，也就是工作在100MHz主频的CPU执行一条运算指令所需时间仅为10ns比工作在50MHz主频时的20ns缩短了一半，自然运算速度也就快了一倍。只不过电脑的整体运行速度不仅取决于CPU运算速度，还与其它各分系统的运行情况有关，只有在提高主频的同时，各分系统运行速度和各分系统之间的数据传输速度都能得到提高后，电脑整体的运行速度才能真正得到提高。</div><div></div><div>　　提高CPU工作主频主要受到生产工艺的限制。由于CPU是在半导体硅片上制造的，在硅片上的元件之间需要导线进行联接，由于在高频状态下要求导线越细越短越好，这样才能减小导线分布电容等杂散干扰以保证CPU运算正确。因此制造工艺的限制，是CPU主频发展的最大障碍之一。</div><div>　　</div><div>　　个人理解的是:</div><div>　　一个微指令周期通常设计成一个CPU时钟周,而一条指令通常需要几条微指令,也就是一条指令占多少个字节就需要多少个时钟周期.</div><div>　　</div><div>　　参考:</div><div>　　http://blog.csdn.net/mydo/article/details/1776304</div></div><img src ="http://www.cppblog.com/aaxron/aggbug/160316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-17 10:08 <a href="http://www.cppblog.com/aaxron/archive/2011/11/17/160316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原码、反码、补码 复习</title><link>http://www.cppblog.com/aaxron/archive/2011/11/14/160102.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 14 Nov 2011 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/14/160102.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/160102.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/14/160102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/160102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/160102.html</trackback:ping><description><![CDATA[<p>原码、反码、补码<br />计算机通常用补码表示整数</p>
<p>公式:负数(x)<br />(x)原码+(x)补码=0,进位丢弃.</p>
<p><br />为了简单起见，我们用1个字节来表示一个整数。</p>
<p>原码<br />将最高位作为符号位（以0代表正，1代表负），其余各位代表数值本身的绝对值（以二进制表示）。<br />&nbsp;&nbsp;&nbsp;&nbsp; +7的原码为： 00000111<br />&nbsp;&nbsp;&nbsp;&nbsp; -7的原码为： 10000111<br />问题：<br />&nbsp;&nbsp;&nbsp;&nbsp; +0的原码为：00000000<br />&nbsp;&nbsp;&nbsp;&nbsp; -0的原码为： 10000000<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; <br />反码：<br />一个数如果为正，则它的反码与原码相同；一个数如果为负，则符号位为1，其余各位是对原码取反。<br />&nbsp;&nbsp;&nbsp;&nbsp; +7的反码为：00000111<br />&nbsp;&nbsp;&nbsp;&nbsp; -7的反码为： 11111000<br />问题：<br />&nbsp;&nbsp;&nbsp;&nbsp; +0的反码为：00000000<br />&nbsp;&nbsp;&nbsp;&nbsp; -0的反码为：11111111<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />补码：<br />一个数如果为正，则它的原码、反码、补码相同；<br />一个数如果为负，则符号位为1，其余各位是对原码取反，然后整个数加1。</p>
<p>+7的补码为：00000111<br />-7的补码为： <br />第一步：由-7原码得到-7的反码,得到11111000，第二步,反码+1=11111001</p>
<p>即负数补码公式:<br />补码=反码+1</p>
<p><br />问题：0的补码表示：<br />+0的补码： 00000000</p>
<p>-0的补码：<br />第一步：得到-0(10000000)的反码:11111111<br />第二步：反码(11111111)+1 = 1 00000000 <br />第三步：进位1被丢弃<br /><br />对于有模运算来讲，减一个数等于加上该数对模的补数。补码就是按补数概念对数据进行编码的。计算机引入补码后，减法可转换为加法，方便运算<br /></p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/aaxron/aggbug/160102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-14 17:57 <a href="http://www.cppblog.com/aaxron/archive/2011/11/14/160102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows内核驱动开发入门学习资料</title><link>http://www.cppblog.com/aaxron/archive/2011/11/07/159726.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 07 Nov 2011 01:20:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/07/159726.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/159726.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/07/159726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/159726.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/159726.html</trackback:ping><description><![CDATA[<span style="color: #555555; font-family: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; font-size: 14px; "><h2>Windows内核驱动开发入门学习资料</h2><div style="margin-top: 5px; margin-right: 5px; margin-bottom: 5px; margin-left: 5px; "><span style="background-image: url(http://www.programlife.net/wp-content/themes/inove/img/icons.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-left: 22px; height: 16px; line-height: 16px; display: block; font-size: 12px; margin-right: 15px; float: left; background-position: 0px -48px; background-repeat: no-repeat no-repeat; ">2011年11月5日</span><span style="background-image: url(http://www.programlife.net/wp-content/themes/inove/img/icons.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-left: 22px; height: 16px; line-height: 16px; display: block; font-size: 12px; float: left; background-position: 0px 0px; background-repeat: no-repeat no-repeat; "><a href="http://www.programlife.net/author/admin/" title="由 代码疯子 发表" style="color: #2970a6; text-decoration: none; ">代码疯子</a></span><span style="background-image: url(http://www.programlife.net/wp-content/themes/inove/img/icons.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-left: 22px; height: 16px; line-height: 16px; display: block; font-size: 12px; margin-left: 15px; float: right; background-position: 0px -112px; background-repeat: no-repeat no-repeat; "><a href="http://www.programlife.net/driver-develop-material.html#respond" style="color: #2970a6; text-decoration: none; ">发表评论</a></span><span style="background-image: url(http://www.programlife.net/wp-content/themes/inove/img/icons.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; padding-left: 22px; height: 16px; line-height: 16px; display: block; font-size: 12px; float: right; background-position: 0px -96px; background-repeat: no-repeat no-repeat; "><a href="http://www.programlife.net/driver-develop-material.html#comments" style="color: #2970a6; text-decoration: none; ">阅读评论</a></span><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; clear: both; "></div></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 5px; padding-left: 5px; line-height: 20px; overflow-x: hidden; overflow-y: hidden; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">声明：本文所描述的所有资料和源码均搜集自互联网，版权归原始作者所有，所以在引用资料时我尽量注明原始作者和出处；本文所搜集资料也仅供同学们学习之用，由于用作其他用途引起的责任纠纷，本人不负任何责任。（本资料由<a href="http://www.programlife.net/" target="_self" style="color: #2970a6; text-decoration: none; "><strong>代码疯子</strong></a>整理）</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong>一、书籍推荐</strong></p><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《Windows驱动开发技术详解》作者：张帆、史彩成；出版社：电子工业出版社</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《天书夜读：从汇编语言到Windows内核编程》作者：谭文、邵坚磊；出版社：电子工业出版社</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《寒江独钓：Windows内核安全编程》作者：谭文、杨潇、邵坚磊；出版社：电子工业出版社</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">其他驱动开发相关书籍</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong>二、源码学习</strong></p><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《Windows驱动开发技术详解》源码下载：http://dl.dbank.com/c0rmlpwkfi</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《寒江独钓：Windows内核安全编程》源码下载：http://dl.dbank.com/c0t5kawz2e</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">DDK 2600 驱动例子源码下载：http://dl.dbank.com/c0oktzwfsf</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">WDK 7600 驱动例子源码下载：http://dl.dbank.com/c0hj1khp8c</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong>三、学习网站</strong></p><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">看雪论坛：http://bbs.pediy.com/</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">驱网：http://bbs.driverdevelop.com/</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">帆子内核驱动网：http://bbs.kerneldev.com/</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">看雪KSSD：http://kssd.pediy.com/</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">一蓑烟雨：http://www.unpack.cn/</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">吾爱破解：http://www.52pojie.cn/</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">DebugMan：http://www.debugman.com/</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong>四、其他资料（整理自看雪）</strong></p><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">驱动程序设计基础 http://bbs.pediy.com/showthread.php?t=56631</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">通俗解析IRP和I/O设备栈在内核程序中的作用 http://bbs.pediy.com/showthread.php?t=111559</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">我的驱动学习笔记 http://bbs.pediy.com/showthread.php?t=88723&nbsp;<a href="http://dl.dbank.com/c0gcp53hf8" target="_blank" style="color: #2970a6; text-decoration: none; ">下载附件</a></li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">驱动入门：从WRK看IRP 理论篇 http://bbs.pediy.com/showthread.php?t=130876&nbsp;<a href="http://dl.dbank.com/c0mbjwfjv4" target="_blank" style="color: #2970a6; text-decoration: none; ">下载附件</a></li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">驱动入门：从WRK看IRP 实践篇 http://bbs.pediy.com/showthread.php?t=130925&nbsp;<a href="http://dl.dbank.com/c0tihm8034" target="_blank" style="color: #2970a6; text-decoration: none; ">下载附件</a>&nbsp;<a href="http://dl.dbank.com/c0cnxa40nz" target="_blank" style="color: #2970a6; text-decoration: none; ">附件2</a></li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong>五、楚狂人（谭文）的Free教程</strong></p><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《Windows驱动编程基础教程》 http://dl.dbank.com/c05tt0rxe5</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 20px; list-style-position: inside; ">《Windows文件系统过滤驱动开发教程*第二版》 http://dl.dbank.com/c0n3p7haef</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">原创文章，转载请注明:<br />本文出自<a href="http://www.programlife.net/" style="color: #2970a6; text-decoration: none; ">程序人生</a>&nbsp;&gt;&gt;&nbsp;<a href="http://www.programlife.net/driver-develop-material.html" style="color: #2970a6; text-decoration: none; ">Windows内核驱动开发入门学习资料</a><br />作者：<strong>代码疯子</strong></p></div></span><img src ="http://www.cppblog.com/aaxron/aggbug/159726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-07 09:20 <a href="http://www.cppblog.com/aaxron/archive/2011/11/07/159726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇编学习笔记1</title><link>http://www.cppblog.com/aaxron/archive/2011/11/04/159626.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 04 Nov 2011 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/04/159626.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/159626.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/04/159626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/159626.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/159626.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">栈<br />运行时栈是由CPU直接管理的内存数组,它使用两个寄存器:SS和ESP&nbsp;(Extended&nbsp;stack&nbsp;pointer)。<br />在保护模式下，SS寄存器存放的是段选择器，用户模式程序不应对其进行修改。<br />ESP寄存器存放的是指向堆栈内特定位置的一个32位偏移值。它指向最后压入(或添加)到堆栈上的数据.<br />我们很少需要直接操纵ESP的值，相反，ESP寄存器的值通常是由CALL，RET，PUSH和POP等指令间接修改的。<br /><br />压栈操作<br />32位的压栈操作(PUSH)操作将使ESP的值减4,并将值拷贝到堆栈指针所指向的位置.<br />出栈操作<br />32位的出栈(POP)操作从堆栈顶端移走一个值,并将值置于寄存器或变量中,在值从栈顶弹出之后,ESP的值加4.<br /><br />PROC伪指令<br />定义子过程的伪指令,以RET语句结束的命名语句块.<br /><br />proc_name&nbsp;PROC<br />&nbsp;&nbsp;&nbsp;&nbsp;param1:DWORD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;参数1<br />&nbsp;&nbsp;&nbsp;&nbsp;param2:PTR&nbsp;BYTE,&nbsp;&nbsp;&nbsp;&nbsp;;参数2<br />&nbsp;&nbsp;&nbsp;&nbsp;param3:PTR&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;;参数3<br />&nbsp;&nbsp;&nbsp;&nbsp;LOCAL&nbsp;localvar1:BYTE&nbsp;&nbsp;&nbsp;&nbsp;;局部变量1<br />&nbsp;&nbsp;&nbsp;&nbsp;LOCAL&nbsp;localvar2:WORD&nbsp;&nbsp;&nbsp;&nbsp;;局部变量2<br />&nbsp;&nbsp;&nbsp;&nbsp;;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.<br />&nbsp;&nbsp;&nbsp;&nbsp;RET&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />..<br />&nbsp;&nbsp;&nbsp;&nbsp;RET&nbsp;&nbsp;&nbsp;&nbsp;;(</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;from&nbsp;procedure)以强制CPU返回到过程被调用的地方<br />proc_name&nbsp;ENDP<br /><br />CALL指令<br />CALL指令将返回地址(通常是CALL指令的下一条指令,CALL指令的机器码需要5字节)压入堆栈并将被调用过程的地址拷贝到指令指针寄存器EIP中,当过程返回时,RET指令从堆栈中弹出地址并送到指令指针寄存器中(ESP所指向堆栈值被弹出并送到EIP).<br />CPU总是执行指令指针寄存器EIP所指向的内存地址处的指令.<br /><br />RET指令<br />在32位保护模式下<br />CPU执行RET指令时，相当于进行：<br />pop&nbsp;EIP<br /><br />CPU执行RET&nbsp;N指令时,这里N是一个自然数,相当于进行：<br />pop&nbsp;EIP<br />add&nbsp;ebp,N<br /><br /><br />局部标号和全局标号<br /><br />局部标号(以单个冒号结尾)在过程中使用.<br />全局标号(以两个冒号结尾)在全局使用.<br /><br />LOCAL&nbsp;伪指令<br />LOCAL伪指令在过程中声明一个或多个局部变量<br />LOCAL&nbsp;变量名:类型<br /><br />如:<br />MySub&nbsp;&nbsp;&nbsp;&nbsp;PROC<br />&nbsp;&nbsp;&nbsp;&nbsp;LOCAL&nbsp;var1:BYTE<br />&nbsp;&nbsp;&nbsp;&nbsp;LOCAL&nbsp;var2:WORD<br />&nbsp;&nbsp;&nbsp;&nbsp;;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.<br />&nbsp;&nbsp;&nbsp;&nbsp;RET<br />MySub&nbsp;ENDP</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/159626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-04 16:34 <a href="http://www.cppblog.com/aaxron/archive/2011/11/04/159626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinDBG的伪寄存器</title><link>http://www.cppblog.com/aaxron/archive/2011/11/03/159548.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 03 Nov 2011 03:11:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/11/03/159548.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/159548.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/11/03/159548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/159548.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/159548.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">WinDBG的伪寄存器<br /><br />$ea<br />上一条指令中的有效地址（effective&nbsp;address）<br /><br />$ea2<br />上一条指令中的第二个有效地址<br /><br />$exp<br />表达式评估器所评估的上一条表达式<br /><br />$ra<br />当前函数的返回地址（retrun&nbsp;address）。<br />例如，可以使用g&nbsp;@$ra返回到上一级函数，与gu（go&nbsp;up）具有同样的效果<br /><br />$ip<br />指令指针寄存器。x86中即EIP，x64即eip<br /><br />$eventip<br />当前调试事件发生时的指令指针<br /><br />$previp<br />上一事件的指令指针<br /><br />$relip<br />与当前事件关联的指令指针，例如按分支跟踪时的分支源地址<br /><br />$scopeip<br />当前上下文（scope）的指令指针<br /><br />$exentry<br />当前进程的入口地址<br /><br />$retreg<br />首要的函数返回值寄存器。x86架构使用的是EAX，x64是RAX，安腾是ret0<br /><br />$retreg64<br />64位格式的首要函数返回值寄存器，x86中是edx:eax寄存器对<br /><br />$csp<br />帧指针，x86中即ESP寄存器，x64是RSP，安腾为BSP<br /><br />$p<br />上一个内存显示命令（d</span><span style="color: #000000; ">*</span><span style="color: #000000; ">）所打印的第一个值<br /><br />$proc<br />当前进程的EPROCESS结构的地址<br /><br />$thread<br />当前线程的ETHREAD结构的地址<br /><br />$peb<br />当前进程的进程环境块（PEB）的地址<br /><br />$teb<br />当前线程的线程环境块（TEB）的地址<br /><br />$tpid<br />拥有当前线程的进程的进程ID（PID）<br /><br />$tid<br />当前线程的线程ID<br /><br />$bpx<br />x号断点的地址<br /><br />$frame<br />当前栈帧的序号<br /><br />$dbgtime<br />当前时间，使用.formats命令可以将其显示为字符串值<br /><br />$callret<br />使用.call命令调用的上一个函数的返回值，或者使用.fnret命令设置的返回值<br /><br />$ptrsize<br />调试目标所在系统的指针类型宽度<br /><br />$pagesize<br />调试目标所在系统的内存页字节数<br /><br /><br />可以直接用上表中的名称来使用伪寄存器，但是更快速的方法是在$前加上一个@符号。这样，WinDBG就知道@后面是一个伪寄存器，不需要搜索其他符号。<br /><br /><br />使用windbg在程序的入口点下断点<br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">、bp&nbsp;@$exentry&nbsp;<br />使用伪寄存器的方法，也是最常用的方法<br /><br /></span><span style="color: #000000; ">2</span><span style="color: #000000; ">、bp&nbsp;poi(@$peb</span><span style="color: #000000; ">+</span><span style="color: #000000; ">8</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">poi(poi(@$peb</span><span style="color: #000000; ">+</span><span style="color: #000000; ">8</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">poi(poi(@$peb</span><span style="color: #000000; ">+</span><span style="color: #000000; ">8</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">3c)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">28</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #000000; ">3</span><span style="color: #000000; ">、bp&nbsp;$iment(poi(@$peb</span><span style="color: #000000; ">+</span><span style="color: #000000; ">8</span><span style="color: #000000; ">))</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/159548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-11-03 11:11 <a href="http://www.cppblog.com/aaxron/archive/2011/11/03/159548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>