汇编语言-004(LABEL 、间接寻址、变址操作数、指针使用、TypeDef、LOOP、DWORD变量交换高位低位字)

1: LABEL : 为一个标号定义大小属性,但不分配内存与下一个变量共用内存,与C中UNION类似

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCoed:DWORD.data
val16 LABEL WORD
val32 DWORD 12345678hLongValue LABEL DWORD
val1 WORD 5678h
val2 WORD 1234h.code
main PROCmov ax,val16    ;5678hmov dx,[val16+2];1234hmov eax,LongValue  ;12345678hINVOKE ExitProcess,0
main ENDP
END main

2: 间接寻址,因为常数偏移量寻址多个数组元素时,直接寻址不实用,反之,用寄存器作为指针(称为间接寻址) 并控制寄存器的值,如果一个操作数使用的间接寻址,就称为间接操作数

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
byteVal BYTE 10h.code
main PROCmov esi,OFFSET byteValmov al,[esi];PTR与间接操作数一起使用;inc [esi] 一个操作数的大小无法从指令看出,报错inc BYTE PTR [esi] INVOKE ExitProcess,0
main ENDP
END main

3: 间接寻址访问数组案例

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
arrayB BYTE 10h,20h,30h
arrayW WORD 1000h,2000h,3000h
arrayD DWORD 10000h,20000h,30000h.code
main PROCmov esi,OFFSET arrayBmov al,[esi]inc esimov al,[esi]inc esimov al,[esi]mov esi,OFFSET arrayWmov ax,[esi]add esi,2mov ax,[esi]add esi,2mov ax,[esi]mov esi,OFFSET arrayDmov eax,[esi]add esi,4mov eax,[esi]add esi,4mov eax,[esi]INVOKE ExitProcess,0
main ENDP
END main

4:变址操作数,访问数组更灵活

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
arrayB BYTE 10h,20h,30h
arrayW WORD 1000h,2000h,3000h
arrayD DWORD 10000h,20000h,30000h.code
main PROCmov esi,0mov al,arrayB[esi]  ;第一种格式constant [reg]mov esi,OFFSET arrayW ;第二种格式 [constant + reg]mov ax,[esi]mov ax,[esi+2]mov ax,[esi+4];比例因子mov esi,3 * TYPE arrayDmov eax,arrayD[esi];更简单的做法mov esi,3 ;下标mov eax,arrayD[esi * 4];使用TYPE 更灵活mov eax,arrayD[esi * TYPE arrayD]INVOKE ExitProcess,0
main ENDP
END main

5: 指针使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
arrayB BYTE 10h,20h,30h,40h
arrayW WORD 1000h,2000h,3000h,4000h
ptrB DWORD arrayB
ptrW DWORD arrayW
;使用OFFSET运算符使这种关系更加准确
optrB DWORD OFFSET arrayB
optrW DWORD OFFSET arrayW.code
main PROCINVOKE ExitProcess,0
main ENDP
END main

6: TypeDef : 定义新类型,与C的typedef 类似,不在.data段内定义的

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORDPBYTE TYPEDEF PTR BYTE     ;字节指针
PWORD TYPEDEF PTR WORD     ;字指针
PDWORD TYPEDEF PTR DWORD  ;双字指针.data
arrayB BYTE 10h,20h,30h,40h
arrayW WORD 1,2,3
arrayD DWORD 4,5,6ptr0 PBYTE ? ;未初始化
ptr1 PBYTE arrayB
ptr2 PWORD arrayW
ptr3 PDWORD arrayD.code
main PROCmov esi,ptr1mov al,[esi]mov esi,ptr2mov ax,[esi]mov esi,ptr3mov eax,[esi]INVOKE ExitProcess,0
main ENDP
END main

7: LOOP : 循环伪指令使用

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
count DWORD ?
bytes BYTE 1,2,3,4
.code
main PROCmov ecx,100     ;设置外层循环计数
L1:mov count,ecx    ;保存外层计数mov ecx,20       ;设置内层计数
L2:mov eax,ecxloop L2       ;重复内层mov ecx,count ;恢复外层计数loop L1       ;重复外层INVOKE ExitProcess,0
main ENDP
END main

8: LOOP_ARRAY : 数组元素求和例子

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
intarray DWORD 10000h,20000h,30000h,40000h.code
main PROCmov edi,OFFSET intarray    ;EDI=intarray地址 作变址操作数mov ecx,LENGTHOF intarray  ;循环计数器初始化为元素个数mov eax,0                  ;EAX 记录总数
L1:add eax,[edi]              ;加一个元素add edi,TYPE intarray      ;指向下一个元素loop L1                    ;重复INVOKE ExitProcess,0
main ENDP
END main

9: LOOP_STRAING : 复制字符串例子

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
source BYTE "This is the source string",0
target BYTE  SIZEOF source DUP(0).code
main PROCmov esi,0               ;变址计数器mov ecx,SIZEOF source   ;循环计数器
L1:mov al,source[esi]      ;从源字符串取一个字符mov target[esi],al      ;保存到目标字符串inc esi                 ;指向下一个字节loop L1                 ;重复INVOKE ExitProcess,0
main ENDP
END main

10: DWORD变量交换高位低位字

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
tword LABEL WORD
three DWORD 12345678h  ;56781234.code
main PROCmov si,tword            ;或者用WORD PTR threemov di,[tword+2]        ;WORD PTR [three + 2]mov tword,di            ;WORD PTR threemov [tword+2],si        ;WORD PTR [three + 2]mov eax,threeINVOKE ExitProcess,0
main ENDP
END main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379429.shtml

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

相关文章

(只需挨个复制粘贴命令即可部署)在Centos7下搭建文件服务器(VSFTPD)

观看北京尚学堂-百战程序员笔记一、VSFTPD简介 Linux的组件(一款软件),安装到Linux后可以通过java代码(FtpClient)实现文件的上传。基于FTP协议。 由于VSFTPD是基于FTP协议,客户端浏览器是需要通过http协议…

POJ 2421 Constructing Roads MST kruskal

最近刚学的并查集所以用kruskal来试试最小生成树~ kruskal其实用几句话就能说完~ 1.贪心所有边的权值,从小到大取值 2.取值时~将边权非0的两个顶点~进行并查操作~如果两个点的祖先不同...边权加入最小生成树...并且将两个点纳入同一个集合中 3.判断是否所有点都在同一个集合中…

c# 声明类的时候初始化类_使用C#初始化的列表声明

c# 声明类的时候初始化类The task is to create/declare a list with an initializer list in C#. 任务是在C#中使用初始化列表创建/声明一个列表 。 C#清单 (C# List) A list is used to represent the list of the objects, it is represented as Lis…

编写程序计算所输日期是当年的第几天

/* 1.输入年月日,编写程序计算所输日期是当年的第几天 *//* 2.已知列车隔日发车,且1/1/2006不发车(无ticket),如果所输入数据在此日期之后,则输出有没有车票,否则仅输出上一步结果。*/ /* month/date/year is which day of the ye…

汇编语言-005(XCHG、标志位操作、算术操作、比例因子的变址寻址、多个常用运算符运用、大端转小端、数组操作)

1: 用不超过3条XCHG指令对4个8位寄存器的值重新排序,A,B,C,D调整为D,C,B,A .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data.code main PROCmov al,Amov bl,Bmov cl,Cmov dl,Dxchg al,dlxchg bl,clINVOKE ExitProcess,0 main ENDP E…

bcd码二进制转十进制_二进制编码的十进制(BCD码)及其加法

bcd码二进制转十进制Prerequisite: Number systems 先决条件: 数字系统 BCD Code (8421 Code): In BCD 8421 code, each decimal digit is represented using a 4-bit binary number. The 4-bit binary numbers have their weights attached as 8, 4, 2, 1 from MS…

SVN服务器部署

一、SVN版本控制器 Subversion就是一款实现版本控制的工具软件,通常也成为版本控制器,简称SVN。 Subversion是Apache软件基金会组织下的一个项目 SVN基本操作: checkout(检出):将一个服务端创建好的项目…

rtmp流\http流测试地址

测试方式:ffplay rtmp://58.200.131.2:1935/livetv/cctv1 rtmp: CCTV-1综合:rtmp://58.200.131.2:1935/livetv/cctv1 CCTV-2财经:rtmp://58.200.131.2:1935/livetv/cctv2 CCTV-3综艺:rtmp://58.200.131.2:1935/livetv/cctv3 CCTV-4中文国际:rtmp://58.2…

LINQ to XML:如何读写XCData

using System;using System.Xml.Linq;namespace ConsoleApplication1 {class Program{static void Main(string[] args){//写入CDATA元素块var doc new XElement("Test",new XElement("User",new XAttribute("name", "chenxizhang"),…

C#中的结构和类之间的区别

C#类和结构 (C# class and structure) In C# and other programming languages, structure and classes are used to define a custom data type, that we can organize according to our need with different types of variables, methods etc. 在C#和其…

[转载]SQL Plus 一些使用技巧

原文地址:SQL Plus 一些使用技巧作者:☆水『若寒Sql*plus的使用 Sql*plus介绍 Sql*plus是oracle提供的一个工具程序,既可以在oracle服务器使用,也可以在oracle客户端使用。在windows下分两种,sqlplus.exe是命令行程序&…

云服务器(Centos)部署SVN

1,安装svn yum install subversion 2,查看版本号 svnserve --version 3,创建SVN版本库(在var/svn 文件夹下) 新建文件夹 mkdir -p /var/svn/svnrepos 创建版本库 svnadmin create /var/svn/svnrepos 4,修改…

ffmpeg命令提取像素格式

1: 提取yuv格式:不修改宽高 取3秒 ffmpeg -i test_1920x1080.mp4 -t 3 yuv420p_orig.yuv ffmpeg -i test_1920x1080.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv 可以使用ffplay播放:ffplay -video_size 1920x1080 yuv420p_orig.yuv 提取y…

Javascript(js)使用function定义构造函数

Javascript并不像Java、C#等语言那样支持真正的类。但是在js中可以定义伪类。做到这一点的工具就是构造函数和原型对象。首先介绍js中的构造函数。 Javascript中创建对象的语法是在new运算符的后面跟着一个函数的调用。如 1 varobj newObject();2 vardate newDate();运算符new首…

错误:将字符串分配给C中的char变量| 常见的C程序错误

If you assign a string to the character variable, it may cause a warning or error (in some of the compilers) or segmentation fault error occurs. 如果将字符串分配给字符变量,则可能会导致警告或错误(在某些编译器中)或发生分段错误。 Consider the code…

【转】用BibTeX 写 Reference

BibTeX 是一种格式和一个程序, 用于协调LaTeX的参考文献处理,BibTeX 使用数据库的的方式来管理参考文献.,BibTeX 文件的后缀名为 .bib。 例子: article{name1, author {作者, 多个作者用 and 连接}, title {标题}, journal {期…

计算机二级C语言易混淆的区别

1,if(a1)与if(a1)的区别 首先,if(a1) 等价于 a1;if(a); 而a 1,是判断a是不是为1; if(sq)里面的分为两种情况,一种是sq为0,不执行if里面的代码内容;另一种是sq不为0,执行里面的代码内…

ffmpeg命令mp3中提取pcm格式

原mp3文件: ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm (这可能是pcm原格式查不到什么信息但是可以播放的:ffplay -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm) ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -samp…

C++ STL map的使用

1、map简介 map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。 2、map的功能 自动建立Key - value的…

bfs广度优先搜索算法_图的广度优先搜索(BFS)

bfs广度优先搜索算法What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先搜索? Breadth First Search is a level-wise vertex traversal process. Like a tree all the graphs have verte…