LDS错误啥意思
指令形式 这里可能是指令错误或是内存错误LDSabbr.1.= Latter-Day Saint 【宗】摩门教徒2.= Lightning Detection System 【气】闪电侦测系统3.= Local Digital Switch 本地数字交换机4.= Low-Dimensional System 低规格系统ldsabbr.1.=large disk storage 大容量磁盘内存指令形式:LDS DEST.SRC 所执行的操作: DEST=WORD PTR [SRC]; DS=WORD PTR [SRC+2]; 特别说明:WORD的意思是字,PTR的意思是指针,合起来的意思就是字指针.也就是说WORD PTR[SRC]意思是SRC所指向的内存地址为2个字节(一个字就是2个字节). 指令格式:LDS REG,MEM 显而易见:DEST需要两个字节,DS也要两个字节,那么MEM肯定是指向4个字节的内存了.4个字节就是双字(Double Word) 假定1000:10F0开始存放了4个字节 1000:10F0 78 1000:10F1 56 1000:10F2 34 1000:10F3 12 它们是倒着存放的-_- (E1000:10F0回车,78空格56空格34空格12空格回车.然后可以U1000:10F0看看写对了没) 然后用DEBUG的A指令写入汇编指令(如果是前面先执行过跟踪,别忘了RIP回车再100回车,将指令指针复原) MOV AX,1000 MOV DS,AX ;段寄存器不可以直接写的,有点麻烦-_-) LDS BX,[10F0] 跟踪可以发现,最后DS=1234;BX=5678 MOV AX,1000 MOV DS,AX LDS BX,[10F0] 这些指令可以换成 MOV AX,1000 MOV ES,AX ES: LDS BX,[10F0] 效果一样. 不过我调试了一下,先写了1000:10F0的内存再写汇编指令的话老是汇编出错.不知道哪里的毛病. 如MOV AX,1000的机器码是B80010;可是写好了再用U反汇编看一下机器码变成了C70A1000. 懒的去调了.就先写了汇编指令然后写内存.跟踪一下.
FSIN怎么用?
C++的sin用的就是FSIN指令下面的指令是通过反汇编一个含有sin的程序得到的:00401084 >$ 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4]00401088 . E8 48050000 CALL FSIN.__fload_withFB0040108D $ 52 PUSH EDX0040108E . 9B WAIT0040108F . D93C24 FSTCW WORD PTR SS:[ESP]00401092 . 74 50 JE SHORT FSIN.004010E400401094 . 66:813C24 7F02 CMP WORD PTR SS:[ESP],27F0040109A . 74 06 JE SHORT FSIN.004010A20040109C . D92D 28114300 FLDCW WORD PTR DS:[__DEFAULT_CW_in_mem]004010A2 >D9FE FSIN004010A4 . 9B WAIT004010A5 . DFE0 FSTSW AX004010A7 . 9E SAHF004010A8 . 7A 1D JPE SHORT FSIN.004010C7004010AA >833D 808F4300 00 CMP DWORD PTR DS:[___fastflag],0004010B1 . 0F85 77050000 JNZ FSIN.__fast_exit004010B7 . BA 1E000000 MOV EDX,1E004010BC . 8D0D 304A4300 LEA ECX,DWORD PTR DS:[434A30]004010C2 . E9 74050000 JMP FSIN.__math_exit004010C7 >DB2D 2A114300 FLD TBYTE PTR DS:[__pi_by_2_to_61]004010CD . D9C9 FXCH ST(1)004010CF >D9F5 FPREM1004010D1 . 9B WAIT004010D2 . DFE0 FSTSW AX基本上已经很精简了,你实在想内联汇编的话试试我写的这个函数吧:#include double WdsySin (double _InputRad){double _ResultTemp;_asm{fld _InputRadfsinfstp _ResultTemp}return _ResultTemp;}int main (){double Num1=3.141592653589793/6;double SinNum1;SinNum1=WdsySin(Num1);printf ("%f\n",SinNum1);return 0;}
汇编中sub esp,1是什么意思!!!!
sub esp,1 在堆栈中留出局部变量的空间看看下面的文章对你的汇编语言一定有帮助!汇编中参数的传递和堆栈修正 在 Win32汇编中,我们经常要和 Api 打交道,另外也会常常使用自己编制的类似于 Api 的带参数的子程序,本文要讲述的是在子程序调用的过程中进行参数传递的概念和分析。
一般在程序中,参数的传递是通过堆栈进行的,也就是说,调用者把要传递给子程序(或者被调用者)的参数压入堆栈,子程序在堆栈取出相应的值再使用,比如说,如果你要调用 SubRouting(Var1,Var2,Var3),编译后的最终代码可能是push Var3push Var2push Var1call SubRoutingadd esp,12也就是说,调用者首先把参数压入堆栈,然后调用子程序,在完成后,由于堆栈中先前压入的数不再有用,调用者或者被调用者必须有一方把堆栈指针修正到调用前的状态。
参数是最右边的先入堆栈还是最左边的先入堆栈、还有由调用者还是被调用者来修正堆栈都必须有个约定,不然就会产生不正确的结果,这就是我在前面使用“可能”这两个字的原因:各种语言中调用子程序的约定是不同的,它们的不同点见下表:C SysCall StdCall Basic Fortran Pascal参数从左到右 是 是 是参数从右到左 是 是 是调用者清除堆栈 是允许使用:VARARG 是 是 是VARARG 表示参数的个数可以是不确定的,有一个例子就是 C 中的 printf 语句,在上表中,StdCall 的定义有个要说明的地方,就是如果 StdCall 使用 :VARARG 时,是由调用者清除堆栈的,而在没有:VARARG时是由被调用者清除堆栈的。
在 Win32 汇编中,约定使用 StdCall 方式,所以我们要在程序开始的时候使用 .model stdcall 语句。
也就是说,在 API 或子程序中,最右边的参数先入堆栈,然后子程序在返回的时候负责校正堆栈,举例说明,如果我们要调用 MessageBox 这个 API,因为它的定义是 MessageBox(hWnd,lpText,lpCaption,UType) 所以在程序中要这样使用:push MB_OKpush offset szCaptionpush offset szTextpush hWndcall MessageBox...我们不必在 API 返回的时候加上一句 add sp,4*4 来修正堆栈,因为这已经由 MessageBox 这个子程序做了。
在 Windows API 中,唯一一个特殊的 API 是 wsprintf,这个 API 是 C 约定的,它的定义是 wsprintf(lpOut,lpFormat,Var1,Var2...),所以在使用时就要:push 1111push 2222push 3333push offset szFormatpush offset szOutcall wsprintfadd esp,4*5下面要讲的是子程序如何存取参数,因为缺省对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 EBP 来存取堆栈,假定在一个调用中有两个参数,而且在 push 第一个参数前的堆栈指针 ESP 为 X,那么压入两个参数后的 ESP 为 X-8,程序开始执行 call 指令,call 指令把返回地址压入堆栈,这时候 ESP 为 X-C,这时已经在子程序中了,我们可以开始使用 EBP 来存取参数了,但为了在返回时恢复 EBP 的值,我们还是再需要一句 push ebp 来先保存 EBP 的值,这时 ESP 为 X-10,再执行一句 mov ebp,esp,根据右图可以看出,实际上这时候 [ebp + 8] 就是参数1,[ebp + c]就是参数2。
另外,局部变量也是定义在堆栈中的,它们的位置一般放在 push ebp 保存的 EBP 数值的后面,局部变量1、2对应的地址分别是 [ebp-4]、[ebp-8],下面是一个典型的子程序,可以完成第一个参数减去第二个参数,它的定义是:MyProc proto Var1,Var2 ;有两个参数local lVar1,lVar2 ;有两个局部变量注意,这里的两个 local 变量实际上没有被用到,只是为了演示用,具体实现的代码是:MyProc procpush ebpmov ebp,espsub esp,8mov eax,dword ptr [ebp + 8]sub eax,dword ptr [ebp + c]add esp,8pop ebpret 8MyProc endp现在对这个子程序分析一下,push ebp/mov ebp,esp 是例行的保存和设置 EBP 的代码,sub esp,8 在堆栈中留出两个局部变量的空间,mov /add 语句完成相加,add esp,8 修正两个局部变量使用的堆栈,ret 8 修正两个参数使用的堆栈,相当于 ret / add esp,8 两句代码的效果。
可以看出,这是一个标准的 Stdcall 约定的子程序,使用时最后一个参数先入堆栈,返回时由子程序进行堆栈修正。
当然,这个子程序为了演示执行过程,使用了手工保存 ebp 并设置局部变量的方法,实际上,386 处理器有两条专用的指令是完成这个功能用的,那就是 Enter 和 Leave,Enter 语句的作用就是 push ebp/mov ebp,esp/sub esp,xxx,这个 xxx 就是 Enter 的,Leave 则完成 add esp,xxx/pop ebp 的功能,所以上面的程序可以改成:MyPorc procenter 8,0mov eax,dword ptr [ebp + 8]sub eax,dword ptr [ebp + c]leaveret 8MyProc endp好了,说到这儿,参数传递的原理也应该将清楚了,还要最后说的是,在使用 Masm32 编 Win32 汇编程序的时候,我们并不需要记住 [ebp + xx] 等麻烦的地址,或自己计算局部变量需要预留的堆栈空间,还有在 ret 时计算要加上的数值,Masm32 的宏指令都已经把这些做好了,如在 Masm32 中,上面的程序只要写成为:MyProc proc Var1,Var2local lVar1,lVar2mov eax,Var1sub eax,Var2retMyProc endp编译器会自动的在 mov eax,V...
MOV [BX],5 在8086/8088汇编语言里面是否正确?如果错误的话为什么...
将立即数写入[BX],在8086汇编中是可行的,CPU提供了这个功能。
但你的写法不正确,因为CPU无法判断传送的数据类型,所以应该改为:(字节传送)mov byte ptr [BX], 5 | …… || 05h | | …… |或(字传送)mov word ptr [BX], 5。
| …… || 05h | | 00h || …… |综上所述,立即数是可以写入内存的,但要显式指定传送的数据类型。
需要注意的是,用于字节传送的立即数不能大于0ffh;字传送的立即数不能大于0ffffh,否则都会引起值超出范围而无法传送。
楼主可在debug下加以验证。
【双阶乘】双阶乘是什么意思?(FactDouble)Office中,有一个
FACTDOUBLE 返回数字的双倍阶乘。
★如果该函数不可用,并返回错误值 #NAME?,请安装并加载“分析工具库”加载宏。
★ 操作方法 在“工具”菜单上,单击“加载宏”。
在“可用加载宏”列表中,选中“分析工具库”框,再单击“确定”。
如果必要,请遵循安装程序中的指示。
语法 FACTDOUBLE(number) Number 要计算其双倍阶乘的数值,如果参数 Number 为非整数,则截尾取整。
说明 ……
C语言程序运行时间测试
C语言获取系统时间的几种方式C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间 精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精确到毫秒5 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒6 要获取高精度时间,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) 获取系统的计数器的频率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) 获取计数器的值然后用两次计数器的差除以Frequency就得到时间。
7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime//*********************************************************************//用标准C实现获取当前系统时间的函数一.time()函数 time(&rawtime)函数获取当前时间距1970年1月1日的秒数,以秒计数单位,存于rawtime 中。
#include "time.h" void main () { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); printf ( "/007The current date/time is: %s", asctime (timeinfo) ); exit(0); } ================= #include -- 必须的时间函数头文件 time_t -- 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long)struct tm -- 时间结构,time.h 定义如下: int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; time ( &rawtime ); -- 获取时间,以秒计,从1970年1月一日起算,存于rawtime localtime ( &rawtime ); -- 转为当地时间,tm 时间结构 asctime ()-- 转为标准ASCII时间格式: 星期 月 日 时:分:秒 年 -----------------------------------------------------------------------------二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
clock_t clock ( void ); #include clock_t t = clock();long sec = t / CLOCKS_PER_SEC;他是记录时钟周期的,实现看来不会很精确,需要试验验证;---------------------------------------------------------------------------三.gettime(&t); 据说tc2.0的time结构含有毫秒信息#include #include int main(void) { struct time t; gettime(&t); printf("The current time is: %2d:%02d:%02d.%02d/n", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); return 0; } time 是一个结构体,, 其中成员函数 ti_hund 是毫秒。
。
。
--------------------------------------------------------------------------------四.GetTickCount(),这个是windows里面常用来计算程序运行时间的函数;DWORD dwStart = GetTickCount();//这里运行你的程序代码DWORD dwEnd = GetTickCount();则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位这个函数只精确到55ms,1个tick就是55ms。
--------------------------------------------------------------------------------五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();//这里运行你的程序代码DWORD dwEnd = timeGetTime();则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位 虽然返回的值单位应该是ms,但传说精度只有10ms。
========================================= //*****************************************************************Unix##unix时间相关,也是标准库的//*********************************************************************1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;time_t timegm(struct tm *tm);2.mktime使用时区信息time_t mktime(struct tm *tm);timelocal 函数是GNU扩展的与posix函数mktime相当time_t timelocal (struct tm *tm);3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;struct tm * gmtime(const time_t *clock);4.localtime使用时区信息struct tm * localtime(const time_t *clock);1.time获取时间,stime设置时间time_t t;t = time(&t);2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;int stime(time_t *tp)3.UTC=true 表示采用夏时制;4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;5.设置时区推荐使用setup来设置;6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t看看你的系统是否有time_t64,它能表示更大的时间范围 //***************************************************************windows##Window里面的一些不一样的//*********************************************************************一.CTime () 类VC编程一般使用CTime类 获得当前日期和时间CTime t = GetCurrentTime(); SYSTEMTIME 结构包含毫秒信息typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; ...
编程题目:利用Opengl绘制一个三角形。
h> #include <math,2.message != WM_QUIT ) { if (PeekMessage(&msg; BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND;/保存当前窗口句柄 //自定义函数 void EnableOpenGL(HWND hWnd); void SceneInit(); void SceneResizeViewport(); void DisableOpenGL(); void Display(); void DrawTriangle(LTRIANGLEPOINT pTrianglePoint; /, WPARAM, int iPointNum = 3);/ Initialize global strings LoadString(hInstance, IDS_APP_TITLE, UINT;/设备上下文 HWND g_hWnd = NULL, PM_REMOVE)) { if(!TranslateAccelerator(msg; SwapBuffers(g_hDC); } } DisableOpenGL(); return (int) msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // This function and its usage are only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_OPENGLTRIANGLE)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_OPENGLTRIANGLE); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNCTION: InitInstance(HINSTANCE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } g_hWnd = hWnd; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } //初始化opengl void EnableOpenGL(HWND hWnd) { PIXELFORMATDESCRIPTOR pfd; int iFormat; g_hDC = GetDC(hWnd); ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW| PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat( g_hDC, &pfd ); SetPixelFormat( g_hDC, iFormat, &pfd ); g_hRC = wglCreateContext(g_hDC); wglMakeCurrent( g_hDC, g_hRC); } //设置着色模式 void SceneInit() { glShadeModel(GL_SMOOTH); glClearColor(1.0, 1.0, 1.0, 0.5); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NIC...
vb中如何用shell函数调用word和excel
Shell 函数 执行一个可执行文件,返回一个 Variant (Double),如果成功的话,代表这个程序的任务 ID,若不成功,则会返回 0。
语法 Shell(pathname[,windowstyle]) Shell 函数的语法含有下面这些命名参数: 部分 描述 pathname 必要参数。
Variant (String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。
Windowstyle 可选参数。
Variant (Integer),表示在程序运行时窗口的样式。
如果 windowstyle 省略,则程序是以具有焦点的最小化窗口来执行的。
windowstyle 命名参数有以下这些值: 常量 值 描述 vbHide 0 窗口被隐藏,且焦点会移到隐式窗口。
VbNormalFocus 1 窗口具有焦点,且会还原到它原来的大小和位置。
VbMinimizedFocus 2 窗口会以一个具有焦点的图标来显示。
VbMaximizedFocus 3 窗口是一个具有焦点的最大化窗口。
VbNormalNoFocus 4 窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。
VbMinimizedNoFocus 6 窗口会以一个图标来显示。
而当前活动的的窗口仍然保持活动。
说明 如果 Shell 函数成功地执行了所要执行的文件,则它会返回程序的任务 ID。
任务 ID 是一个唯一的数值,用来指明正在运行的程序。
如果 Shell 函数不能打开命名的程序,则会产生错误。
注意 缺省情况下,Shell 函数是以异步方式来执行其它程序的。
也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
word排版行距的问题写论文proposal碰到的问题(正文是英
恩,text is double-spaced 是说内容在输入的时候每个单词之间相隔两个空格的距离(除了比较长的引文部分和bibliography参考文献用一个空格),there is one blank line between a section heading and the text that follows it说每段标题与正文间要空一行,还有注意最后一句说不要使用右对齐。
。
。
转载请注明出处51数据库 » Doubleword ptr
不是公主命却得了公主病