(译)win32asm教程-4

【电路设计实战】BUCK降压电路:从原理到PCB布局的降噪与效率优化 本文深入剖析了BUCK降压电路的工作原理,并针对其固有的开关噪声问题,提供了从核心元件选型到PCB布局的全面优化方案。文章重点探讨了电感、电容等关键元件的选型要点,强调了低ESR电容和肖特基二极管的重要性,并详细阐述了如何通过最小化功率回路、保护敏感信号线等PCB布局实战技巧,有效抑制噪声、提升效率与稳定性。 阅读详情
 

50伪代码

伪代码是给处理器的指令,它实际上是原始十六进制代码的可读版。因此,汇编是最低级的编程语言。汇编中的所有东西被直接翻译为十六进制码。换句话说,你没有把高级语言翻译为低级语言的编译器上的烦恼,汇编器仅仅把汇编代码转化为原始数据。

本章将讨论一些用来运算,位操作等的伪代码。还有跳转指令,比较等伪代码在后面介绍。

3.  1一些基本的计算伪代码

MOV

这条指令用来把一个地方移往(事实上是复制到)另一个地方。这个地方可以是寄存器,内存地址或是直接数值(当然只能作为源值)。Mov指令的语法是:

mov 目标,源

你可把一个寄存器移往另一个(注意指令是在复制那个值到目标中,尽管“mov”这个名字是移的意思)

mov edx, ecx

上面的这条指令把ecx的内容复制到了ecx中,源和目标的大小应该一致。例如这个指令是非法的:

mov al, ecx;非法

这条伪代码试图把一个DWORD32位)值装入一个字节(8位)的寄存器中。这不能个由mov指令来完成(有其他的指令干这事)。但这些指令是允许的因为源和目标在大小上并没有什么不同:

mov al, bl
mov cl, dl
mov cx, dx
mov ecx, ebx

内存地址由offset指示(在win32中,前一章中有更多信息)你也能从地址的某一个地方获得一个值并把它放入一个寄存器中。下面有一个例子:

offset

34

35

36

37

38

39

3A

3B

3C

3D

3E

3F

40

41

42

data

0D

0A

50

32

44

57

25

7A

5E

72

EF

7D

FF

AD

C7

每一个块代表一个字节

offset的值这里是用字节的形式表示的,但它事实上是32位的值,比如3A(这不是一个常见的offset的值,但如果不这样简写表格装不下),这也是一个32位的值:0000003Ah。只是为了节省空间,使用了一些不常见的低位offset。所有的值均为16进制。

看上表的offset 3A。那个offset的数据是25, 7A, 5E, 72, EF等。例如,要把这个位于3A的值用mov放入寄存器中:

mov eax, dword ptr[0000003Ah]

h后缀表明这是一个十六进制值)

mov eax, dword ptr[0000003Ah]这条指令的意思是:把位于内存地址3ADWORD大小的值放入eax寄存器。执行了这条指令后,eax包含了值725E7A25h。可能你注意到了这是在内存中时的反转结果:25 7A 5E 72。这是因为存储在内存中的值使用了little endian格式。这意味着越靠右的字节位数越高:字节顺序被反转了。我想一些例子可以使你把这个搞清楚。

十六进制dword32位)值放在内存中时是这样:40, 30, 20, 10(每个值占一个字节(8位))

十六进制word16位)值放在内存中时是这样:50, 40

回到前面的例子。你也可以对其他大小的值这么做:

mov cl, byte ptr [34h] ; cl得到值0Dh(参考上表)
mov dx, word ptr [3Eh] ; dx
将得到值 7DEFh (看上表,记住反序)

大小有时不是必须的。

Mov eax,[00403045h]

因为eax32位寄存器,编译器假定(也只能这么做)它应该从地址403045(十六进制)取个32位的值。

直接数值是允许的:

mov edx, 5006

这只是使得edx寄存器装有值5006,综括号[]用来从括号间的内存地址处取值,没有括号就只是这个值。寄存器和内存地址也可以(他应该是32位程序中的32位寄存器):

mov eax,403045h;使eax装有值403045h(十六进制)
mov cx,[eax];
把位于内存地址eaxword大小的值(403045)移入cx寄存器。

mov cx, [eax]中,处理器会先查看eax装有什么值(=内存地址),然后在那个内存地址中有什么值,并把这个word(16位,因为目标-cx-是个16位寄存器)移入cx。

ADD, SUB, MUL, DIV

许多伪代码做计算工作。你可以猜出它们中的大多数的名字:add(加),sub(减),mul(乘),div(除)等。

Add伪代码有如下语法:

Add 目标,源

执行的运算是 目标=目标+源。下面的格式是允许的。

目标

例子

Register

Register

add ecx, edx

Register

Memory

add ecx, dword ptr [104h] / add ecx, [edx]

Register

Immediate value

add eax, 102

Memory

Immediate value

add dword ptr [401231h], 80

Memory

Register

add dword ptr [401231h], edx

这条指令非常简单。它只是把源值加到目标值中并把结果保存在目标中。其他的数学指令有:

sub 目标,源(目标=目标-源)
mul 目标,源(目标=目标×源)
div 源(eax=eax/源,edx=余数)

减法和加法一样做,乘法是目标=目标×源。除法有一点不同,因为寄存器是整数值(注意,绕回数不是浮点数)除法的结果被分为商和余数。例如:

28/6->商=4,余数=4
30/9->商=3,余数=3
97/10->商=9,余数=7
18/6->商=3,余数=0

现在,取决于源的大小,商(一部分)被存在eax中,余数(一部分)在edx:

源大小

除法

商存于

余数存于

BYTE (8-bits)

ax / source

AL

AH

WORD (16-bits)

dx:ax* / source

AX

DX

DWORD (32-bits)

edx:eax* / source

EAX

EDX

*:例如,如果dx=2030h,而ax=0040h,dx:ax=20300040h。dx:ax是一个双字值。其中高字代表dx,低字代表ax,Edx:eax是个四字值(64位)其高字是edx低字是eax。

Div伪代码的源可以是

  • an 8-bit register (al, ah, cl,...)
  • a 16-bit register (ax, dx, ...)
  • a 32-bit register (eax, edx, ecx...)
  • an 8-bit memory value (byte ptr [xxxx])
  • a 16-bit memory value (word ptr [xxxx])
  • a 32-bit memory value (dword ptr [xxxx])

源不可以是直接数值因为处理器不能决定源参数的大小。

位操作

这些指令都由源和目标,除了“NOT”指令。目标中的每位与源中的每位作比较,并看是那个指令,决定是0还是1放入目标位中。

指令

AND

OR

XOR

NOT

源位

0

0

1

1

0

0

1

1

0

0

1

1

0

1

目标位

0

1

0

1

0

1

0

1

0

1

0

1

X

X

输出位

0

0

0

1

0

1

1

1

0

1

1

0

1

0

如果源和目标均为1,AND把输出位设为1。

如果源和目标中有一个为1,OR把输出位设为1。

如果源和目标位不一样,XOR把输出位设为1。

NOT反转源位

一个例子:

mov ax, 3406
mov dx, 13EAh
xor ax,dx

ax=3406(十六进制)是二进制的0000110101001110

dx=13EA(十六进制)是二进制的0001001111101010

对这些位进行xor操作:

0001001111101010 (dx)

目标

0000110101001110 (ax)

输出

0001111010100100 (new ax)

dx是0001111010100100 (十进制的7845, 十六进制的1EA4)

另一个例子:

mov ecx, FFFF0000h
not ecx

FFFF0000在二进制中是11111111111111110000000000000000(16个1,16个0)如果反转每位会得到

00000000000000001111111111111111(16个0,16个1)在十六进制中是0000FFFF。因而执行NOT操作后,ecx是0000FFFFh。

步增/减

有两个很简单的指令,DEC和INC。这些指令使内存地址和寄存器步增或步减,就是这样:

inc reg -> reg = reg + 1
dec reg -> reg = reg - 1
inc dword ptr [103405] ->
位于103405的值步增
dec dword ptr [103405] ->
位于103405的值步减

NOP

这条指令什么都不干。它仅仅占用空间和时间。它用作填充或给代码打补丁的目的。

位移(Bit Rotation shifiting

注意:下面的大部分例子使用8位数,但这只是为了使目的清楚。

Shifting函数

SHL 目标,计数(count
SHR
目标,计数(count

SHLSHR在寄存器,内存地址中像左或向右移动一定数目(count)的位。

例如:

;这儿al01011011(二进制)
shr al, 3

它的意思是:把al寄存器中的所有位向右移三个位置。因而al会变成为00001011。左边的字节用0填充,而右边的字节被移出。最后一个被移出的位保存在carryflag中。Carryflag是处理器标志寄存器的一位,它不是像eaxecx一样的,你可以访问的寄存器(虽然有伪代码干这活),但它的值决定于该指令的结构。它(carryflag)会在后面解释,你要记住的唯一一件事是carry是标志寄存器的一位且它可以被打开或者关闭。这个位等于最后一个移出的位。

Shlshr一样,只不过是向左移。

;这儿bl11100101(二进制)
shl bl, 2

执行了指令后bl10010100(二进制)。最后的两个位是由0填充的,carryflag1,因为最后移出的位是1

还有两个伪代码:

SAL 目标, 计数(算术左移)

SAR 目标, 计数(算术右移)

SALSHL一样,但SAR不完全和SHR一样。SAR不是用0来填充移出的位而是复制MSB(最高位)例如:

al = 10100110
sar al, 3
al = 11110100
sar al, 2
al = 11101001

bl = 00100110
sar bl, 3
bl = 00000100

Rotation(循环移动) 函数

Rol 目标,计数;循环左移
Ror 目标,计数;循环右移
Rcl 目标,计数;通过carry循环左移
Rcr 目标,计数;通过carry循环右移

循环移动(Rotation)看上去就像移(Shifting),只是移出的位又到了另一边。

例如:Ror(循环右移)

 

 

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

 

原来

 

1

0

0

1

1

0

1

1

 

循环移动,计数=3

 

 

 

 

1

0

0

1

1

0 1 1 (移出)

结果

 

0

1

1

1

0

0

1

1

 

如你在上图所见,位循环了。注意,每个被推出的位又移到了另一边。和Shifting一样,carry位装有最后被移出的位。Rcl和Rcr实际上和Rol,Rcr一样。它们的名字暗示了它们用carry位来表明最后移出的位,但和Rol和Ror干同样的事情。它们没有什么不同。

交换

XCHG指令也非常简单。它同在两个寄存器和内存地址之间交换:

eax = 237h
ecx = 978h
xchg eax, ecx
eax = 978h
ecx = 237h

C语言实验——各位数字之和排序 C语言实验——各位数字之和排序Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description给定n个正整数,根据各位数字之和从小到大进行排序。 Input输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面... 阅读详情

相关推荐

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1578

mysql评论回复表设计_数据库设计——评论回复功能

1、概述评论功能已经成为APP和网站开发中的必备功能。本文主要介绍评论功能的数据库设计。评论功能最主要的是发表评论和回复评论(删除功能在后台)。评论功能的拓展功能体现有以下几方面:(1)单篇文章的评论数量和信息展示;(2)从时间维度,按照时间倒叙的方式展示动态的用户评论信息;(3)不同栏目,不同模块,不同时间维度的评论排行展示;(4)精华评论的单独推荐和聚合展示;(5)评论后直接分享到绑定的第三方...

weixin_29062255的博客 4515

Qt/C++编写自定义控件49-飞机仪表盘

一、前言 飞行仪表是测定和表示飞机数据的工具,飞机中必不可少的一部分,飞行员根据飞行仪表表示的数据才能正确地做出判断。一般飞机仪表包括高度表+空速表+垂直速率表+姿态仪+航向指示表+转弯协调表。 这次要绘制的是其中的姿势仪,显示飞机相对于地平线的姿态,看姿态仪,飞行员能判断飞机姿态为偏左偏右,及偏上和偏下。姿态仪作用原理为一高度旋转的陀螺,不论飞机的姿态如何变化,此陀螺的定轴性在空间保持相同,因而...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 6982

树形结构的数据库表设计

树形结构的数据库表设计 最近研究树形菜单网上找了很多例子看了。一下是网上找的一些资料,然后自己重新实践,记录下免得下次又忘记了。 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化。然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS,设计合适的Sc

mokingone的专栏 1万+

树状结构数据的数据库表设计及使用 - 2. 路径枚举(Path Enumeration)模型

本文以 MySQL 为例。文档比较长,故分为5部分发出: 路径枚举模型 路径枚举(Path Enumeration)模型通过一个字符串字段记录保存从根节点到本节点经过的所有节点枚举。创建一个表,为了方便就把人员信息和路径信息放在一起了。 路径枚举模型的特点是通过将所有祖先的信息联合成一个字符串,并保存为每个节点的一个属性。字符串的构建根据喜好或需要。上面的 path_string 也可以写成 ‘A/C/E’ 或 ‘A_C_E’ 这样的。emp_id 也可以是数字,例如 ‘1/3/5’ 。路径枚举模型的问题与

不吃_花椒的博客 3586

设计数据库表的注意事项

三范式 规范化(Normalization)是用于数据库设计的一系列原理和技术,它可以减少表中数据的冗余,增加数据完整性和一致性。 第一范式(1NF)是指表中的字段都是不可再分的原子属性,同时表需要有一个主键。 第二范式(2NF)首先需要满足第一范式,非主键字段必须完全依赖于主键字段,不能只依赖于主键的一部分。 第三范式(3NF)首先需要满足第二范式,非主键字段不能依赖于其他非主键字段。为了提高查询性能可以降低规范化的级别,也就是反规范化(Denormalization) 假如说现在我们有一个表,这个表

qq_46134095的博客 1148

数据库设计——评论回复功能

原文链接:   http://blog.csdn.net/ztchun/article/details/71106117    1、概述 评论功能已经成为APP和网站开发中的必备功能。本文主要介绍评论功能的数据库设计。 评论功能最主要的是发表评论和回复评论(删除功能在后台)。评论功能的拓展功能体现有以下几方面: (1)单篇文章的评论数量和信息展示; (2)从时间维度,按照时间倒叙的方式展...

zl_j_c的博客 697

SpringBoot+Vue实现博客评论组件:树形结构、安全防护与性能优化

评论系统是现代Web应用中实现用户互动与社区建设的基础功能模块,其核心在于处理用户生成内容(UGC)的存储、展示与交互。从技术原理上看,一个健壮的评论系统通常采用树形数据结构来组织评论与回复关系,这涉及到父子节点关联、递归查询与前端渲染等关键技术点。在工程实践中,评论系统的技术价值不仅在于提升用户参与度,更在于保障内容安全与系统性能。例如,必须集成敏感词过滤和XSS防护机制来抵御恶意输入,同时通过数据库索引优化、缓存策略(如Redis)和前后端分离架构来应对高并发场景。典型的应用场景包括博客、新闻资讯、电商

weixin_33806300的博客 374

MASM宏使用总结

MASM宏使用总结td.general1 { background-color : #ffcc00; } td.general2 { background-color : #CCCC99; } td.general3 { background-color : #cccc99; } td { font-size: 11px;}bod

taowen2002的专栏 2995

怎样建立你自己的MASM导入库

怎样建立你自己的MASM导入库by Iczelion (翻:花心萝卜yqzq@163.net) 9.5.2000      这篇短文是讲述关于建立MASM导入库(import libraries)技巧,我假设你已经知道什么是导入库。在下面,我将集中讲述建立MASM导入库的方法。MASM导入库的格式:    MASM和VC++可以使用相同的导入库,MS导入库使用不同于TASM的OMF格

taowen2002的专栏 2241

Win32Asm 教程-1

Win32Asm 教程这是我的Win32Asm教程。它总是创建中,但我会不停地添加内容。通过上面的next和prev链接,你可以转到后面和前面一页。介绍先来对这个教程做个小介绍。Win32Asm不是一个非常流行的编程语言,而且只有为数不多(但很好)的教程。大多数教程都集中在编程win32部分(例如,winAPI,使用标准Windows编程技术等),而不是汇编语言本身,例如伪代码(op

taowen2002的专栏 1988

汇编来实现OOP

汇编来实现OOPtaowen本人在OOP方面刚刚入门,只是看过一些国外这方面的好材料,才萌生了写本文的念头。希望能够起到抛砖引玉的作用,引出高手们的批评和建议。OOP和面向过程都是编程中的思想,用学术一些的话是paradigm。曾经有人说过,既然cfront生成的是C代码,那么用C本身乃至汇编都可以实现OOP,只是太多东西需要自己手工来完成

taowen2002的专栏 1884

汇编访问COM对象

汇编访问COM对象Ernest Murphy ernie@surfree.com Revised Dec 26 2000 for inclusion as part of MASM32Revised July 10 2000 for the new form of coinvoke.Sample code for this article

taowen2002的专栏 1853

win32asm实例-1

  1.0 - New project新的工程Create a new folder named mosaic in your asm projects folder (it is adviceable to create this folder on the same drive as the MASM package so you can use the relative li

taowen2002的专栏 1420

win32asm实例-6

 6.0 - The tiles window图块窗口We will now create a static control which we will draw the tiles on.我们将创建一个静态控件。在它上面我们将要画图块。6.1 - Creating the control创建控件We make a new procedure called InitContro

taowen2002的专栏 1365

win32asm实例-0

  这个教程写得非常好,希望你能喜欢。-者Mosaic tutorial拼图游戏教程Introduction介绍In this lesson you will create a simple mosaic game. You probably know this kind of puzzles. An image or a matrix of numbers have to

taowen2002的专栏 1339

win32asm教程-10

 11.0 Windows中的汇编基础现在你已经有了一些汇编语言的基础知识,你将要学习在Windows中怎样学习汇编。10.1APIWindows编程的根本在于Windows API,应用程序接口。这是由操作系统提供的一套函数。每个Windows程序员都要用这些函数。这些函数在像kernel, user, gdi, shell, advapi等系统dll中。函数有两类:ANSI和U

taowen2002的专栏 1322

win32asm教程-2

 3.0 asm基础知识这章将教你汇编语言的基础知识1.  1伪代码(opcodes)汇编程序是用伪代码创建的。一个伪代码是一条处理器可以理解的指令。例如:ADDAdd指令把两个数加到一起。大部分伪代码有参数ADD eax, edxADD有两个参数。在加法的情况下,一个源一个目标。它把源值加到目标值中,并把结果保存在目标中。参数有很多不同的类型:寄存器,内存地址,直

taowen2002的专栏 1249

win32asm教程-12-完结

 这个是本系列教程的最后一篇了。下面我可能会贴出关于用汇编写一个游戏的实例。仍然是面向基础,面向初学者的。在此,也要感谢原作者:james的大力支持,无偿提供本文的中文权。-者taowen200213.0 Windows中的窗口在本章中,我们将创建一个有窗口的程序12.1窗口你可能已经猜到了Windows之所以称为Windows的原因了。在Windows中,有两种程序:GU

taowen2002的专栏 1247

win32asm实例-7

 7.0 - Drawing the tiles画图块The tile control is already made, now its time for the drawing of the tiles. The tile image can be one of these images:图块控件已经被创建了,现在是画图块的时候了。图块的图象可以是这些图象中的一个:Numb

taowen2002的专栏 1245

win32asm教程-3

 4.0内存这部分将解释在Windows中内存是如何管理的。3.  1Dos和win3.xx在像用于Dos和Win3.xx的16位程序中,内存被分成许多个段。这些段的大小为64kb。为了存储内存,需要一个段指针和一个偏移址指针。段指针标明要使用哪个段,offset指针标明在段本身的位置。看下图:内存段 1 (64kb)段 2 (6

taowen2002的专栏 1225

exa_fml_ortho_damage_umat.f_hasin准则UMAT_

可以计算三维的编织材料,也可以用于计算层合板并可以考虑层间破坏

酷开刷机升级数据 42K1T、49K1T、55K1T等K1系列 8A16机芯 整机USB升级程序 稳定版V015.004.220

刷机方法:下载后不能解压,直接使用!1、将下载好的8A16_K1_Vxxxxxx.zip复制到单分区的U盘的根目录下(U盘不能有任何文件夹)2、断电或待机状态下,插入U盘,按住电视机的键控板的电源键再开机,按住15秒左右,系统会自动进入android的recovery升级菜单。3、此时请用遥控器将光标移动到最后- -行“apply update from EXT”进入U盘,选择指定的升级文件进行升级。4、U盘先格式化FAT32格式; U盘用4~-8G的金士顿U盘容易识别。其它U盘识别低。

上一篇: (译)Programming Windows-2
下一篇: (译)win32asm教程-2
taowen2002
博客等级 码龄25年 8粉丝 61原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值