2005.7.10

Windows 汇编语言编程教程

Version 1.02

 

Copyright@2005,Jeff Huang.All rights reserved

 

Translator:fqh  2005.7.10

 

 

JEFF HUANG 作,fqh译

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


目录

   ……………………………………………………………………………2

为什么选用汇编语言 …………………………………………………………2

为什么选择Windows系统……………………………………………………2

Ⅰ开始学习之旅 ……………………………………………………………….…3

编译器   ………………………………………………………………………3

编辑器 …………………………………………………………………………3

Ⅱ第一个程序  ……………………………………………………………………4

控制台程序 ……………………………………………………………………4

窗体程序 ………………………………………………………………………6

ADDR OFFSET  ………………………………………………………6

Ⅲ汇编基础…………………………………………………………………………7

cpu寄存器 ……………………………………………………………………7

指令集基础 ……………………………………………………………………8

     Push Pop…………………………………………………………………8

     Invoke   ……………………………………………………………………9

程序例子 ………………………………………………………………………9

IV. 窗体程序基础…………………………………………………………………10

预备知识………………………………………………………………………10

     ……………………………………………………………………………10

     过程…………………………………………………………………………10

变量…………………………………………………………………………10

一个简单的窗体程序…………………………………………………………11

IV. 深入汇编和系统………………………………………………………………13

字符串操作……………………………………………………………………13

文件管理………………………………………………………………………13

     存储…………………………………………………………………………14

   程序例子……………………………………………………………………14

控制……………………………………………………………………………15

附加资源 …………………………………………………………………………16

     互联网………………………………………………………………………16

     书籍…………………………………………………………………………16

     MASM32……………………………………………………………………16

     MSDN………………………………………………………………………16

     新闻组………………………………………………………………………16

     IRC …………………………………………………………………………16

 

 

 


“This is for all you folks out there,who want to learn the magic art of Assembly programming”

-MAD

 

我最近才开始学习windows系统汇编语言编程,这个教程是我在学习汇编语言的过程中写下来的。我阅读大量的在线教程、书本,以及通过新闻组以及IRC通讯工具请问他人,本人就是通过这些方式学习汇编语言的。互联网上有很多的汇编编程的教程,但这些教程只是侧重于X86汇编。因为这些教材都假定读者已经掌握了高级编程语言以及基本的计算机系统知识。

 

为什么选用汇编语言?

汇编语言具有若干的特色,使得在某此情况下,汇编语言是一种很好的选择。

1 快速 汇编语言程序运行的速度比高级语言程序要快。通常,要求运行效率高的子程序是用汇编语言编写的。

2 强大 运用汇编语言,你能得到不受限制的权力。相对的,高级语言则有种种限制,在实现某些特定的要求时变得困难。

3 体积小 汇编语言程序通常比其他语言程序要小得多。这种特性在空间有限的情况下是非常有用的。

为什么选择Windows系统?

在任何操作系统和处理器模式下,都可以编写相应的汇编语言程序的。但是当前,多数人在使用基于x86处理器的Windows系统,所以从编写运行于此种环境下的程序开始我们的教程。一旦一种汇编语言的基础知识掌握了,我们就会很容易写出在其他运行环境下汇编程序。

第一章

Ⅰ开始学习之旅

编写汇编程序,我们必须具备一些工具,它们是编译器以及编辑器。我们选择了一些能胜任这些工作的运行于Windows系统的工具如下。

编译器

编译器能把写下的汇编程序代码转换成机器码。通常,它附带有一个连接器。连接器用来连接可编译文件并从中生成可执行文件。Windows系统的可执行文件是以.exe为后缀的。下面给出一些流行的编译器:

1 MASM 这个编译器是本教程所选用的,在学习本教程的过程中,你可以使用它。它原先由微软公司开发,现在被包括在MASM32v8程序包内了。MASM32v8程序包还包括了其他的工具。你可以从这个网址得到它:http://www.masm32.com/.

注意:教程中有一些指令和宏指令,只有在MASM编译器才是有效的,所以强烈建议您从开始学习时选用MASM

2. TASM 这是另一个受欢迎的编译器。由Borland公司开发,现在依然是个商业软件,所以你不能免费地获取到它。

3. NASM 一个免费开放源码的编译器,它也能在其他系统平台上使用。它可以从这个网址获取到http://sourceforge.net/projects/nasm/ 记住

编辑器

编辑器是在编译前编写程序代码的软件。编辑器可以个人自由选择。现在在很多种编辑器,你可以试用一下它们并选择一种你喜欢的。

1 Notepad 记事本,Windows系统自带的。虽然它缺少很多功能,但它使用简便。

2 Visual Studio 它不是免费的编辑器,但它出色的语法高亮显示功能能让你的代码更易于阅读。

3. 其他 还有很多其他的编辑器,在些不一一列出它们的名字。其中一些很受欢迎:

a. Ultraedit (我个人最喜欢的e) http://www.ultraedit.com/

b. Textpad http://www.textpad.com/

c. VIM http://www.vim.org/

d. Emacs http://www.gnu.org/software/emacs/emacs.html

e. jEdit http://www.jedit.org/


 

第二章

 


Ⅱ第一个程序

现在我们有了自己的工具,打开你的文本编辑器,跟着下面的介绍,开始学习编程吧。这是世上最普通的程序,“Hello World”程序。

控制台程序

控制台程序是运行在系统控制台的(也就大家所知的命令行)。为创建这个程序,首先粘贴下面的代码到你的文本编辑器上,并保存为文件“hello.asm”。

.386

.model flat, stdcall

option casemap :none

include /masm32/include/windows.inc

include /masm32/include/kernel32.inc

include /masm32/include/masm32.inc

includelib /masm32/lib/kernel32.lib

includelib /masm32/lib/masm32.lib

.data

HelloWorld db "Hello World!", 0

.code

start:

invoke StdOut, addr HelloWorld

invoke ExitProcess, 0

end start

现在,通过开始菜单,点“运行…”选项,输入“cmd”(没有引号)并回车,就能进入到命令行。接着在cmd下转到保存有”hello.asm”的目录,输入"/masm32/bin/ml /c /Zd /coff hello.asm"。期望编译器不会提示错误,你的程序能被正确编译!然后,我们还得连接它,所以接着输入"/masm32/bin/Link /SUBSYSTEM:CONSOLE hello.obj"。祝贺你!你已经成功编译了第一个汇编语言程序。在文件夹里出现了一个中Hello.exe的文件。在命令行下打"hello"来运行你的程序。它会输出"Hello World!"。可见,为了显示"Hello World!",我们只要编写很少的代码就可以了。

这些代码都起了什么作用呢?让我们一行一行地看下去。

.386

这条指令的作用是告知编译器使用.386指令集。当前,几乎没有处理器使用比.386更老的指明令集了。我们还可以选择使用.486.或586,但是.386是兼容性最好的指令集。


.model flat, stdcall

.MODEL 是一条指定你程序的内存模式的汇编指令。Flat是一种方便的系统程序模式,因为在这种模式下不再区分远指针(far)和近指针(far)。Stdcall 是一种系统函数传递参数的方法,它意味着你得以从右到左的顺序传递你的参数。

option casemap :none

强制你的程序代码大小写敏感,这意味着Hello和hello被看做不同的。很多高级编程语言同样是大小写敏感的,所以这是个编程的良好习惯。

include /masm32/include/windows.inc

include / masm32/include/kernel32.inc

include /masm32/include/masm32.inc

这是系统程序必需的包含文件。windows.inc通常必须包含的,因为它包含了Win32 API常量和定义的声明。kernel32.inc包含了我们所使用的ExitProcess函数。masm32.inc包含有StdOut函数。StdOut函数不是Win32函数,它是MASM32v8新增进去的。

includelib /masm32/lib/kernel32.lib

includelib /masm32/lib/masm32.lib

函数依赖库,基于这个目的,这些库得包含进去。

.data

程序中所有初始化的数据必须放在这条指令下面。此外,还有别的指令比如.data?和.const。它们分别位于未初始化数据和常量的前面,但是,在我们的”Hello World”程序中并没有用到它们。

HelloWorld db "Hello World!", 0

db代表“字节”,并声明HelloWorld为一个字符串。"Hello World!"后面跟着一个”NULL”字母,这是因为ANSI字符串必须以NULL结尾。

.code

这代表程序代码段的开始。

start:

你程序的代码位于这个标号的后面,但位于” end start”前面。

invoke StdOut, addr HelloWorld

Invoke调用一个函数及其参数,addr HelloWorld位于它后面。这一行所做的是传递"Hello World!"的地址和调用StdOut。注意StdOut函数只是在MASM32中有效的,它是一个调用其它函数来输出文件的宏。在别的编译器里,你得使用更多的代码并要用到win32函数WriteConsole.。

invoke ExitProcess, 0

显而易见,它传递参数0到ExitProcess函数,从而退出进程。
窗体程序

我们也可以编写一个有窗体版本的“Hello World”程序。粘贴下面文本到你的文件编辑器里并保存为文件"hellow.asm".

.386

.model flat, stdcall

option casemap :none

include /masm32/include/windows.inc

include /masm32/include/kernel32.inc

include /masm32/include/user32.inc

includelib /masm32/lib/kernel32.lib

includelib /masm32/lib/user32.lib

.data

HelloWorld db "Hello World!", 0

.code

start:

invoke MessageBox, NULL, addr HelloWorld, addr HelloWorld, MB_OK

invoke ExitProcess, 0

end start

现在,再打开命令行并转到"hellow.asm"所在目录。输入"/masm32/bin/ml /c /Zd /coff hellow.asm"回车,接着输入"/masm32/bin/Link /SUBSYSTEM:WINDOWS hellow.obj"并回车。注意,subsystem是WINDOWS不再是CONSOLE。这个程序弹出一个显示"Hello World!"的信息框。

与控制台版相比,窗体版本的代码只有3行是不同的。其中有两行把masm32包含文件和库文件更换为user32包含文件和库文件,这是因为我们现在是使用MessageBox函数,而不是使用StdOut了。第3个不同的行是用MessageBox函数代替了StdOut函数。不同之处就这么多而已!

ADDR OFFSET

在我们“Hello World!”程序例子中,我们使用了'addr' 来获取字符串"Hello World!"的地址。还有另外一个类似的指令'offset',虽然两者的目的都是在程序执行中获取变是变量的地址。它们主要的区别是'offset' 只能获取全局变量的地址,然而addr能获取全局变以及局部变量的地址。然而我们不讨论局部变量,所以不用担心这种区别。但是我们还是要记住这种区别的。

第三章

汇编基础

cpu寄存器

现在我们已经能够编写并运行一个简单的程序了。让我们转到本教程的核心内容-汇编基本语法吧。你要写出自己的汇编程序,这些基本的知识是要掌握的。     32位通用寄存器有8个。它们其中前面四个也就是eax,ebx,ecx,edx,也能用它们16位或8位的名字形式进行存取。比如,ax存取eax的低16位,al存取低8位,还有ah存取的是9到16位。其余的寄存器也能以类似的方式进行存取。就如大家想象的那样,这些通用寄存器虽然大多有专用的用途,但它们有通用的地方。

地址

名称

描述

EAX*

累加寄存器

进行计算操作和保存数据结果

EBX

基址寄存器

指向数据寄存器中的数据

ECX*

计数寄存器

字符串以及循环的计数

EDX*

数据寄存器

输入/输出的指针

ESI

源变址寄存器

字符串操作中的源指针

EDI

目的变址寄存器

字符串操作中的目的指针

ESP

堆栈指针寄存器

堆栈指针,不能人为使用它

EBP

堆栈基址寄存器

指向堆栈中的数据

 

注意:虽然它们被称为通用寄存器,但是只有那些标有*号的才能在窗体程序编程中使用。

 

 

 

 


下面是6个16位的段寄存器。它们定义在存储器的段。

地址

名称

描述

CS

代码段寄存器

保存要运行的指令

DS,ES,FS,GS

数据段寄存器

数据段

SS

堆栈段寄存器

当前程序的堆栈

 

最后,还有2个32位的没有归类的寄存器

地址

名称

描述

EFLAGE

标志寄存器

状态,控制,系统标志

EIP

指令指针寄存器

下一个要执行的指针的偏移

 


指令集基础

x86指令集非常宏大,但是我们通常并没全都使用到了它们。下面介绍一些我们应该掌握的指令。

指令

描述

ADD* reg/memory, reg/memory/constant

把两个操作数相加并把结果保存进第一个操作数。如果有进位的话,它会设置CF标志位

SUB* reg/memory, reg/memory/constant

第一个操作数减去第二个操作数,并把结果保存到第一个操作数里

AND* reg/memory, reg/memory/constant

两个操作数逻辑与,并把结果存到第一个操作数里

OR* reg/memory, reg/memory/constant

两个操作数逻辑或,并把结果存到第一个操作数里

XOR* reg/memory, reg/memory/constant

两者异或,并把结果存到第一个操作数里。注意你不能对

两个存储器操作数进行异或操作

MUL reg/memory

操作数与累加器寄存器相乘,而后把结果存进累加器寄存

DIV reg/memory

累加器寄存器被操作数除并把结果存到累加器

INC reg/memory

操作数的值增1并把结果存进操作数

DEC reg/memory

操作数的值减1并把结果存进操作数

NEG reg/memory

操作数的值取补并把结果存进操作数

NOT reg/memory

操作数的值取反并把结果存进操作数

PUSH reg/memory/constant

把操作数压进堆栈顶端

POP reg/memory

弹出堆栈顶端的值并保存到操作数

MOV* reg/memory, reg/memory/constant

把第二个操作数的值保存到第一个操作数里面

CMP* reg/memory, reg/memory/constant

第一个操作数减第二个操作数,并设置相应当的标志位。通常与JMP,REP等指令一起使用

JMP** label

跳转到标号处

LEA reg, memory

取第二个操作数的地址偏移,并把结果保存进第一个操作数

CALL subroutine

调用另一个过程直到程序返回

RET

程序返回到调用者

INT constant

调用操作数指定的中断

*指令不能有两个存储器操作数

**这个指令可以结合条件来使用。比如,JNB(不小于),是只有在CF=0这一条件下才会跳转。

最新的全部指令集参考可以从下面这个网址得到

http://www.intel.com/design/pentium4/manuals/index.htm.

Push Pop

Push和pop是操作堆栈的指令。Push获取一个数据并把它压进堆栈的顶端。Pop获取堆栈顶端的数据,弹出并保存它。因此,堆栈是使用一个先进后出的存取方式(LIFO)。堆栈是计算机中一个常见的数据结构,所以如果你在编程过程中对堆栈操作感到不顺手的话我建议你先掌握这一知识。
Invoke

InvokeMASM特有的一个伪指令。它使得在调用函数前不必先传递参数。这让我们省略了很多的代码。

举个例子说明如下

invoke SendMessage, [hWnd], WM_CLOSE, 0, 0

等效于:

push 0

push 0

push WM_CLOSE

push [hWnd]

call [SendMessage]

程序例子

下面是一个完整的程序。它说明了如何去使用指令和寄存器。看看是否全部弄懂了它。

.386

.model flat, stdcall

option casemap :none

include /masm32/include/windows.inc

include /masm32/include/kernel32.inc

include /masm32/include/masm32.inc

includelib /masm32/lib/kernel32.lib

includelib /masm32/lib/masm32.lib

.data

ProgramText db "Hello World!", 0

BadText db "Error: Sum is incorrect value", 0

GoodText db "Excellent! Sum is 6", 0

Sum sdword 0

.code

start:

; eax

mov ecx, 6 ; set the counter to 6 ?

xor eax, eax ; set eax to 0 0

_label: add eax, ecx ; add the numbers ?

dec ecx ; from 0 to 6 ?

jnz _label ; 21

mov edx, 7 ; 21

mul edx ; multiply by 7 147

push eax ; pushes eax into the stack

pop Sum ; pops eax and places it in Sum

cmp Sum, 147 ; compares Sum to 147

jz _good ; if they are equal, go to _good

_bad: invoke StdOut, addr BadText

jmp _quit

_good: invoke StdOut, addr GoodText

_quit: invoke ExitProcess, 0

end start

注意:“;”符号表示注释。所有跟在它后面的字符都不会被编译。把提示和注意点放在注释中是个好主意,它能让你的代码易读。

第四章

 

 

 

 

 


IV. 窗体程序基础

窗体程序通常由一个或几个窗体组成。因此,做为windows程序员至少要懂得怎么创建一个简单的窗体。很不幸,它不是那么容易的事,但是本教程会指导你怎么去做。

预备知识

在编写窗体程序前我们还要讨论几个主题。让我们花点时间复习一下预备知识。

MASM有几个让汇编编程变得非常容易的宏。我们已经接触到’invoke’,它简单地调用一个函数。下面列出其他几种,之前在你用高级语言编程时它们的用法是很明显的。

o .if, .else, .endif

o .while, .break, .endw

过程

与高级语言类似,MASM让你定义各种过程使得你的代码易于阅读。它们的格式如下所示:

<name> proc <var1>:<var1 type>, <var2>:<var2 type>, ...

<function code>

ret

<name> endp

返回值保存在eax寄存器里,这个过程用下面格式来调用

invoke <name>, param1, param2, ...

返回值可以用下面指令来获取

mov RetVal, eax

变量

变量被分配在内存中的,并用来存储你的数据。在没有足够的寄存器可用的情况下,变量是非常有用的。变量有两种类型全局变量和局部变量。如果全局变量已被初始化,它们被置于.data块;如果它们没被初始化的话,就被置于.data?块。还有,如果全局变量被初始化并且不会被改变的话,它们就被置于.const块。声明全局变量的格式如下:

<name> <type> <value, or ? if uninitialized>

局部变量是被放于过程内部的,暂时保存,供过程内部使用。它们在创建时不能被初始化。格式如下:

local <name>:<type>

有几种变量类型以后将会遇到。其中有几种常见,比如’byte’,’word’ (4 bytes),’dword’(8 bytes)。还有更多,但是它们常常与这三种类型中的一种是相同的,只不过名称不同。


一个简单的窗体程序

窗体程序有两个主要的部分。第一部分是WinMain,它创建窗体还包含叫实现消息循环的代码。“消息循环”监视消息并分派消息。第二部分是过程返回WndProc,它是接收消息的,这部分处理你的鼠标事件及刷新窗口等。

.386

.model flat, stdcall

option casemap :none

include /masm32/include/windows.inc

include /masm32/include/user32.inc

include /masm32/include/kernel32.inc

includelib /masm32/lib/user32.lib

includelib /masm32/lib/kernel32.lib

以上是我们通常必需的

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD

This is a function prototype. It let's us call the WinMain function later in the program.

It can be compared to a C/C++ function declaration.

这是函数原型。在稍后的程序里我们称它为WinMain函数。

.data

ClassName db "WinClass", 0

AppName db "Simple Window", 0

我们声明我们的字符变量

.data?

hInstance HINSTANCE ?

变量hInstance保存模块实例的句柄,以便与窗体相关联。稍后我们将把它传递到CreateWindow函数中。

.code

start:

invoke GetModuleHandle, NULL

mov hInstance, eax

invoke WinMain, hInstance, NULL, NULL, 0

invoke ExitProcess, eax

获取模块句柄并把它保存到变量hInstance中。接着调用WinMain函,而已退出。WinMain是这个程序的核心,所以我们将深入研究它。

注意:从这点来看,我们假设你能够从MSDN中查找windows函数。它有函数参数,返回值,还有其它你必须了解的信息。你可以在附加资源这个章节里获取关于MSDN的信息。

 

 

 


WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR,

CmdShow:DWORD

local wc:WNDCLASSEX

local msg:MSG

local hwnd:HWND

这是WinMain函数的开头部分。我们声明了三个局部变量:wcmsg,,还有hwndWc保存我们创建的窗口类,窗体类是一个创建窗体的模板。Msg保存消息循环中返的消息。Hwnd保存我们窗本的句柄。

mov wc.cbSize, SIZEOF WNDCLASSEX

mov wc.style, CS_HREDRAW or CS_VREDRAW

mov wc.lpfnWndProc, offset WndProc

mov wc.cbClsExtra, NULL

mov wc.cbWndExtra, NULL

注意:在窗体程序中,’or’操作运算符常常用来联合参数中的标志。

push hInstance

pop wc.hInstance

mov wc.hbrBackground, COLOR_WINDOW+1

mov wc.lpszMenuName, NULL

mov wc.lpszClassName, offset ClassName

invoke LoadIcon, NULL, IDI_APPLICATION

mov wc.hIcon, eax

mov wc.hIconSm, eax

invoke LoadCursor, NULL, IDC_ARROW

mov wc.hCursor, eax

invoke RegisterClassEx, addr wc

这些是填充我们先前声明的wc结构。然后以wc为参数调用RegisterClassEx。至于更多关于wc的每个成员的信息,请在MSDN中查找WNDCLASSEX结构的资料。

invoke CreateWindowEx, 0, addr ClassName, addr AppName, WS_OVERLAPPEDWINDOW

or WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,

NULL, hInst, NULL

mov hwnd, eax

调用CreateWindowEx函数创建窗体。其中有很多参数被传递进去来表明怎么创建窗体。窗体的句柄会返回并保存到变量hwnd中。

.while TRUE

invoke GetMessage, addr msg, NULL, 0, 0

.break .if (!eax)

invoke TranslateMessage, addr msg

invoke DispatchMessage, addr msg

.endw

这个while循环也就是先前提到的消息循环。当一个输入事件发生,系统会传递这个事件到一个消息里,并把消息放进程序的消息队列中去。GetMessage取回这些消息并保存进变量msg里。TranslateMessage把键盘消息转换成字符消息。最后,DispatchMessage把这些消息发送到WndProc函数里。在WndProc函数中,这些消息将会被处理。

mov eax, msg.wParam

ret

WinMain endp

返回值保存进msg.wParam,WinMain函数结束。

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.if uMsg == WM_DESTROY

invoke PostQuitMessage, 0

.else

invoke DefWindowProc, hWnd, uMsg, wParam, lParam

ret

.endif

xor eax, eax

ret

WndProc endp

WndProc函数是处理消息的地方。唯一一个一定要处理的消息是WM_DESTROY,它通过调用PostQuitMessage来退出程序。如果有其它你要处理的事件,你可以在这里把它们加进来。普通要处理的消息是WM_CREATE(当创建窗体时),WM_PAINT (当窗体必须重画时), 还有WM_CLOSE (关闭窗体时)。其它没有处理的消息被传递给DefWindowProc函数对消息进行默认处理

end start

就这些了。你已经了解了怎么去创建一个窗体!


 

第五章

IV. 深入汇编和系统

下面有一些资料来扩展你关于汇编以及系统编程方面的知识:字符串操作,文件处理,还有系统窗体的控制。

字符串操作

字符串,数组都是程序中的基本部分。如果你想显示文本或者请求使用者输入,它们就用得了。它们使用到了如下的寄存器:esi,edi,ecx,eflag中的方向控制标志。方向控制标志是指定移动字符串时的方向。一些常见的字符串操作指令是movsb, cmpsb, stasb, and stosb.为了操作字符串,你可以在字符串控制指令中使用某些rep?的形式。下面是在串操作指令中可以使用到rep?前缀

 

前缀

串操作指令

描述

rep

movsb

复制字符串

repe

cmpsb

比较字符串

repne

scasb

扫描字符串中一个字符

rep

stosb

保存一个字符到字符串中

下面给个复制字符串的例子

cld ; sets the direction flag to forward

mov esi, source ; move the source address in to esi

mov edi, dest ; move the destination address in to edi

mov ecx, length ; move the length to copy in to ecx

rep movsb ; copy length bytes from esi to edi

文件管理

在旧的DOS系统世界时,文件是通过使用中断进行操作的。在windows系统里,我们通过使用系统函数访问文件。其中可供我们使用的4种函数是:

CreateFile 创建或打开一个文件,并返回它的句柄

ReadFile 从文件中读取数据

WriteFile 写数据到文件里

CloseHandle 关闭你用CreateFile函数得到的句柄
存储

为了读取文件内容,我们必须分配一些内存来存储数据。内存可以如你所愿地被分配,锁定,但是最后记得解锁和释放。做这些工作的函数是GlobalAlloc, GlobalLock, GlobalUnlock, 还有GlobalFree。相当容易,呵呵!

程序例子

这个程序读取"c:/test.txt"的内容,并通过一个消息框输出。

.386

.model flat, stdcall

option casemap :none

include /masm32/include/windows.inc

include /masm32/include/user32.inc

include /masm32/include/kernel32.inc

includelib /masm32/lib/user32.lib

includelib /masm32/lib/kernel32.lib

一些通常的包含文件

.data

FileName db "c:/test.txt", 0

.data?

hFile HANDLE ?

hMemory HANDLE ?

pMemory DWORD ?

ReadSize DWORD ?

我们定义字符串,还声明了四个将会用到的变量

.const

MEMORYSIZE equ 65535

这是说明分配多大的内存,这样有足够的空间保存我们的文件

.code

start:

invoke CreateFile, addr FileName, GENERIC_READ, FILE_SHARE_READ,

NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL

mov hFile, eax

调用CreateFile函数并保存文件句柄到hFile变量。通常,放置一个'h'在句柄之前,而放置'p'在指针之前

invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMORYSIZE

mov hMemory, eax

invoke GlobalLock, hMemory

mov pMemory, eax

分配并锁定我们的内存

invoke ReadFile, hFile, pMemory, MEMORYSIZE-1, addr ReadSize, NULL

invoke MessageBox, NULL, pMemory, addr FileName, MB_OK

这些行是读文件到内存中并输出其内容

invoke GlobalUnlock, pMemory

invoke GlobalFree, hMemory

invoke CloseHandle, hFile

invoke ExitProcess, NULL

end start

可别忘清除工作啊
控制

一旦创建了一个窗体程序,我们就会想在上面放置一些按钮还有文件框在上面。幸运地,这是容易的事!它的语法非常类似于创建一个窗体,除此外,我们不必调用RegisterClassEx,因为我们的类将为我们预先定义了。为了做到这些,从第4章内容那里编辑WndProc函数来响应WM_CREATE消息

.elseif uMsg == WM_CREATE

invoke CreateWindowEx, NULL, addr ButtonClassName, addr ButtonText, WS_CHILD

or WS_VISIBLE or BS_DEFPUSHBUTTON, 10, 50, 80, 30, hWnd, ButtonID, hInstance, NULL

mov hButton, eax

invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr EditClassName, NULL, WS_CHILD

or WS_VISIBLE, 10, 10, 100, 20, hWnd, EditID, hInstance, NULL

mov hEdit, eax

.data块,你还要增加几个变量。定义EditClassName为"edit",ButtonClassName 为"button"。还有,你要定义EditID 和ButtonID为常量。它们的值是什么并没关系,只要它们在其它控制里不出现相同的ID。此外,你不能对变量hEdit和hButton进行初始化,因为它们都是句柄类型。最后,ButtonText必须赋值为字符串,它将显示在按钮上。现在我们还想知道按钮是什么时候被按下的。这可以通过监视WM_COMMAND消息获知,一个如果按下按钮将会发送的消息。

.elseif uMsg == WM_COMMAND

mov eax, wParam

.if ax == ButtonID

shr eax, 16

wParam参数包含了有关消息的信息。我们可以检查它是否是那个按钮发送的消息,因为既然我们不想处理其他控制的消息。Shr是右移位操作指令,它把wParam右移16位。这是一种存取32位寄存器的高16位好方法,这样我们通过访问ax就可以很容易做到了。

.if ax == BN_CLICKED

<code for what happens if the button is pressed>

.endif

.endif

现在我们知道按钮已经被按下,我们可以对其做一些事了。如果有兴趣学习更多的窗体知识,看一下附加资源这章节。它列出了一些不错有关系统常规编程的参考书和网站


附加资源

互联网

http://www.xs4all.nl/~smit/ -有有用的x86汇编编程教程

http://win32asm.cjb.net/ -有优秀的关于windows汇编编程的教程

http://board.win32asmcommunity.net/ -.一个很活跃的讨论关于windows汇编编程的在线论坛

书籍

Programming Windows, 第四版,Charles Petzold著作,是一本出色的系统编程书。它给出了很多系统编程的代码例子,覆盖了关于系统编程的很大范围的主题。

Intel Pentium 4 Processors Manuals, 可从http://www.intel.com/design/pentium4/manuals/ 获取到。它是x86汇编编程的完整的参考。

The Art of Assembly Programming, Randall Hyde所著, 可从

http://webster.cs.ucr.edu/AoA.html获取到。它是我见过最好的和最全面的的x86汇编编程书中

MASM32

在你的/masm32/HELP/目录里。它是一个叫masm32.hlp的文件,包含了MASM32指南。它有所有关于宏,标志,代码优化等资料。这是学习汇编特别是MASM32非常好的参考。

MSDN

MSDN通常是Visual Studio自带有的,你也可以从网站http://msdn.microsoft.com/在线游览。它包括了关于Windows的系统函数,常量,及所有能够被想象到资料。

新闻组

目前有两个涉及x86汇编的新闻组。它们是comp.lang.asm.x86 alt.lang.asm。两者都有相当高的访问量,拥有很多知识渊博的读者

IRC

有一个关于windows汇编编程的IRC(internet relay chat)频道,#win32asm on EFNet [http://www.efnet.org/]

 

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 打造完整网络直播方案

    2016年8月9日,阿里云在国家会议中心召开2016云栖大会.北京峰会,在这场名为“DT NEXT”的大会中,阿里云发布了一系列的重磅消息和重磅新品,让到场的数千名观众真正的感受到了阿里云在云计算、人工智能和大数据方面的快速进展,也让阿里云向国际化又迈出了坚实的一步。在此次…...

    2024/4/28 22:43:28
  2. 纯html如何引用百度的富文本编辑器ueditor

    最近项目遇到了纯html页面使用富文本编辑器的需要,思来想去还是百度的富文本功能最丰富,但是ueditor只提供了jsp的demo,参照jsp页面可以直接用java实现jsp页面的功能,从而解决html页面引用ueditor问题。第一步: 把ueditor 文件引用到前段框架里第二步:修改ueditor.config…...

    2024/4/28 16:02:31
  3. 每日新闻丨五方面推动云计算产业发展;字节跳动与澎湃合资成立视听科技

    ▼趋势洞察工信部副司长:从五方面入手推动云计算产业快速发展2月16日消息,在今天召开“第九届中国云计算标准和应用大会”上,工业和信息化部信息化和软件服务业司副司长董大健表示,我国企业上云空间巨大,云计算会迎来新一轮更为广阔的蓬勃发展机遇期。下一步,工信部将从五…...

    2024/4/29 2:01:09
  4. .net下的富文本编辑器FCKeditor的配置方法

    .net下的富文本编辑器FCKeditor的配置方法(图)原创 FCKeditor是一款开源的富文本编辑器,几乎支持所有流行的Web开发语言,版本稳定,用户多,可配置性好。 以前做Java和php的时候就一直用FCKeditor,现在做.net了继续用。呵呵。 我用在对文章的评论页面,所以只需要少部分…...

    2024/4/27 23:30:30
  5. VS2010/MFC编程入门系列教程

    http://www.jizhuomi.com/software/257.htmlVS2010/MFC编程入门教程之目录和总结鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事。作…...

    2024/4/28 13:30:05
  6. VC网络编程实战视频教程

    图书:《Visual C++ 网络编程案例实战》 相关视频教程,见下面网址,非常详细,值得学习。VisualC网络编程案例实战01:Visual C网络编程http://v.ku6.com/show/HeYGLUly4n2feYVxDGTreg...html?st=1_9_2_0&nr=1VisualC++网络编程案例实战视频01:Visual C++网络编程概述 h…...

    2024/4/28 14:04:45
  7. 计算机二进制祖宗是西方人?中国道教一张八卦图千年前早已解释!

    1与0,一切数字的神奇渊源。这是造物美妙的典范,因为,一切无非都来自上天。西方:从一枚古银币谈起1697年元旦,莱布尼茨写了一封信给鲁道夫奥古斯都公爵。写信的同时,他赠送了一颗自己制造的银币给公爵,这颗银币的出现,真正预示着二进制的诞生。银币的正面当然是公爵帅气…...

    2024/4/28 5:59:27
  8. 【数字图像处理】图像的灰度变换和直方图均衡化处理

    摘要:在本篇文章中我将先对于灰度变换的一些基础的知识进行陈述。在那之后我将基于先前已经完成的基于图像处理的基础代码实现图像的灰度变换。为了可以绘制一幅直方图,我不得不在从底层实现一些基础的画笔工具,随后基于前面的灰度变换,我可以绘制出一幅图像的直方图。基于…...

    2024/4/28 6:10:29
  9. Linux系统高级编程系列教程

    Linux系统高级编程系列教程系统调用 01、什么是系统调用? 02、Linux系统调用之I/O操作(文件操作) 03、文件描述符的复制:dup(), dup2() 多进程实现多任务 04、进程的介绍 05、Linux可执行文件结构与进程结构 06、多进程实现多任务(一):fork() 07、多进程实现多任…...

    2024/4/28 21:13:53
  10. Linux命令三-VIM文本编辑器(vi vim)

    版权声明:本文为博主原创文章,未经博主允许不得转载!!欢迎访问:https://blog.csdn.net/qq_21439395/article/details/81952776交流QQ: 824203453vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大。只有命令,没有菜单。《大碗》编辑器版周围的同事不是用VI就是Em…...

    2024/4/28 11:48:50
  11. Unix/Linux编程实践教程(一)

    -------------------------------前言呃。。。。开始入坑linux。参考书当然是《Unix/Linux编程实践教程》现写下心得笔记,有什么不对的,请大家指正哈。------------------------------修正2018.5.13貌似我用自己的虚拟机也不行,先暂时放下吧,这个还分析不了原因。。。。难道…...

    2024/4/28 6:23:27
  12. IIS 配置负载均衡

    1.下载Application Request Route安装文件,文件地址 2.安装后打开IIS,会出现Server Farms3.我的局域网中有一台机器的IP为10.0.1.1,作为分流服务器 4.在本地创建一个端口为8086的站点,并打开该站点的“应用程序池”的高级设置,更改以下属性:标识-NetworkService,加载用户配…...

    2024/4/28 21:54:04
  13. Android首席设计师宣称移动概念已死,开发者应该面向屏幕编写应用而非移动

    腾讯科技对Android首席设计师Duarte“移动已死”访谈内容的翻译错得离谱,被到处转载,误人视听,而要真正理解Duarte所想表达的含义,需要深入了解互联网前沿设计理念以及移动网络的发展、本地应用APP的现状。为正确表达文章原意,校正翻译如下。原文发表于踏得网(Techbrood.…...

    2024/4/20 23:36:23
  14. summernote 富文本编辑器 简单实例

    summernote 富文本编辑器简介Summernote 是一个简单,灵活,所见即所得(WYSIWYG)的编辑器,基于 jQuery 和 Bootstrap 构建。Summernote 所有主要的操作都支持快捷键,有一个功能强大的 API,它提供了大量的自定义选项的设计(宽,高,有效的项目等等)和功能。对于主要的脚本…...

    2024/4/20 23:36:23
  15. Scratch可视化编程入门教程-新手教程

    Scratch可视化编程入门教程Scratch 安装下载1.下载Adobe AIR2.下载Scratch建议注册Scratch网站账号百度网盘链接 Scratch 安装 Scratch官网 : https://scratch.mit.edu/进入网站后最好收藏一下。 如果不习惯英文界面,可以将滚动条翻到页面最下面,设置网站的语言为简体中文(选…...

    2024/4/20 5:20:26
  16. 架构设计:负载均衡层设计方案(2)——Nginx安装

    前一篇文章《架构设计:负载均衡层设计方案(1)——负载场景和解决方式》中我们描述了要搭设负载均衡层的业务场景和负载均衡层搭建和扩展思路。从这篇文章开始的后几篇文章,我们将详细介绍Nginx、LVS和Nginx+Keepalived、LVS+Keepalived和LVS+Nginx+Keepalived的安装细节,以…...

    2024/4/20 5:07:49
  17. git创建分支,合并分支,常用命令

    本文非原创,来源于:点击这里这篇文章写得非常全面,而且通俗易懂,本文详细的介绍了:git如何创建分支,如何合并分支,如何管理分支,如何解决冲突。Git 分支几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时…...

    2024/4/20 23:36:19
  18. java多文本框使用右键弹出菜单复制粘贴剪切功能实现

    在学习JPopupMenud的过程中,做了一个小软件。实现了多个文本框,同时使用右键弹出菜单,并实现复制、粘贴、剪切功能。 实际上在网上查的时候,网上有一个很普遍的右键复制、粘贴、剪切的功能(http://blog.csdn.net/xinem/article/details/3866904)。我抄过来发现可以实现功…...

    2024/4/20 23:36:19
  19. C#网络编程技术教程pdf 文档分享

     《C#网络编程技术教程》是一本系统介绍C#网络编程技术的教材,《C#网络编程技术教程》共11章,由两部分组成。第1部分(第1~5章)为基础知识,内容包括Visual C#.NET集成开发环境、C#语言的基础知识、面向对象的程序设计、C#的Windows编程方法、C#的常用数据类、网络编程的…...

    2024/4/20 23:36:18
  20. nginx配置tomcat负载均衡+nginx服务器+apache后端服务器

    nginx配置tomcat负载均衡nginx可以作为Web前置机,将客户请求按照一定算法合理分配给后置的tomcat应用服务器,从而达到均衡目的。当然如果应用使用了session会话,后置的tomcat应用还要保证session共享才能达到应用集群效果。本文不讨论tomcat的集群问题,重点讨论nginx如何配…...

    2024/4/20 21:17:28

最新文章

  1. 图像处理:乘法滤波器(Multiplying Filter)和逆FFT位移

    一、乘法滤波器&#xff08;Multiplying Filter&#xff09; 乘法滤波器是一种以像素值为权重的滤波器&#xff0c;它通过将滤波器的权重与图像的像素值相乘&#xff0c;来获得滤波后的像素值。具体地&#xff0c;假设乘法滤波器的权重为h(i,j)&#xff0c;图像的像素值为f(m,…...

    2024/4/29 2:17:40
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. audio_video_img图片音视频异步可视化加载

    最近在做即时消息&#xff0c;消息类型除了文字还有音频、视频、图片展示&#xff0c;如果消息很多&#xff0c;在切换聊天框时&#xff0c;会有明显卡顿&#xff0c;后续做了懒加载&#xff0c;方案是只加载用户能看到的资源&#xff0c;看不到的先不加载&#xff1b; LazyAud…...

    2024/4/27 13:10:31
  4. Golang Gin框架

    1、这篇文章我们简要讨论一些Gin框架 主要是给大家一个基本概念 1、Gin主要是分为路由和中间件部分。 Gin底层使用的是net/http的逻辑&#xff0c;net/http主要是说&#xff0c;当来一个网络请求时&#xff0c;go func开启另一个协程去处理后续(类似epoll)。 然后主协程持续…...

    2024/4/23 6:22:17
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57