《Intel汇编第5版》 汇编调用子过程

一、Call和Ret指令

  

二、在子过程中需要自己保存可能会修改掉的寄存器值,这里可以使用USES伪指令来生成

  

三、一个数组求和的汇编例子

  

 1 TITLE Call a Proc Demo
 2 INCLUDE Irvine32.inc
 3 includelib Irvine32.lib
 4 includelib kernel32.lib
 5 includelib user32.lib
 6
 7
 8 .data
 9 array    DWORD    1000h,2000h,3000h,4000h
10
11 .code
12
13 ;---------------------------------------------------
14 ;
15 ; Calcute the sum of an array of 32-bit int integers
16 ; Receives:    ESI = the array offset
17 ;        ECX = the size of array
18 ; Returns:    EAX = sum of an array
19 ;---------------------------------------------------
20
21 ArraySum PROC
22
23     push esi
24     push ecx
25     mov eax,0
26 L1:
27     add eax,[esi]
28     add esi,TYPE DWORD
29     loop L1
30
31     pop ecx
32     pop esi
33     ret
34
35 ArraySum endp
36
37 ;---------------------------------------------------
38 ;
39 ; Calcute the sum of an array of 32-bit int integers
40 ; Receives:    ESI = the array offset
41 ;        ECX = the size of array
42 ; Returns:    EAX = sum of an array
43 ;---------------------------------------------------
44
45 ArraySumWithUses PROC USES    esi ecx
46
47     mov eax,0
48 L2:
49     add eax,[esi]
50     add esi,TYPE DWORD
51     loop L2
52
53     ret
54
55 ArraySumWithUses endp
56
57
58
59 main PROC
60
61     mov esi,offset array
62     mov ecx,LENGTHOF array
63     call ArraySum
64     call DumpRegs
65     mov esi,offset array
66     mov ecx,LENGTHOF array
67     call ArraySumWithUses
68     call DumpRegs
69     ret
70
71 main endp
72
73 END main

执行结果:

时间: 2025-01-31 08:48:55

《Intel汇编第5版》 汇编调用子过程的相关文章

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写 一丶内存寻址模型 逻辑地址.线程地址.物理地址 了解汇编之前.先了解一下上面这些词的含义; 逻辑地址: 这个是邮编一起生成的.逻辑地址一般都是 段加段内偏移组成的.每个进程独享. 线性地址: 由分段管理机制.将逻辑地址转化为线性地址.这个了解即可.学过内核的人看到应该明白.如果没有学过.简单滤过即可(32位下逻辑 = 线性) 物理地址: 通过分页管理机制(内核中成为PDE PTE等页目录 页表等等)将线性地址转化为物理地址. 这些了

父页面调用子页面的方法

其实一句话就可以调用子页面的方法了,何必整得那么纠结是吧,感谢java大神: var dsjg1=document.getElementById("div-dsjg").contentWindow.checkEmpty(); 我的子页面有一个方法: 子页面js: function checkEmpty(){ alert("我是儿子!"); } 子页面body内容省略. 父页面: <iframe id="div-dsjg" src="

(转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)

C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象 笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中,加入了如下代码来创建和显示子窗口: Private childFrm myChildFrm = null; //定义子窗口对象 private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e) { myChildF

Android开发笔记(8)——调用子Activity

转载请注明:http://www.cnblogs.com/igoslly/p/6853730.html  调用子Activity 需要子Activity返回值 MainActivity使用startActivityForResult方法 毋需子Activity返回值 MainActivity使用startActivity方法 MainActivity传值子Activity 直接设置intent.putExtras MainActivity传值时: Intent intent =new Inten

akka入门-调用子Actor处理消息

程序演示了父子结构的Actor处理消息.父Actor接收到消息后调用子Actor处理. 1.创建父子Actor import java.util.UUID; import com.center.akka.simple.command.Command; import com.center.akka.simple.event.Event; import akka.actor.ActorRef; import akka.actor.Props; import akka.actor.UntypedAct

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

汇编指令长度计算方法(学习汇编)

一.没有操作数的指令,指令长度为1字节.如es:ds:cbwxlat等. 二.操作数只涉及寄存器的指令,指令长度为2字节.如mov al,[si]mov ax,[bx+si]mov ds,ax等. 三.操作数涉及内存地址的指令,指令长度为3字节.如mov al,[bx+1]mov ax,[bx+si+3]lea di,[1234]mov [2345],ax等. 四.操作数涉及立即数的指令,指令长度为:寄存器类型+2.8位寄存器,寄存器类型=1:16位寄存器,寄存器类型=2.如mov al,8 ;

dedeCMS中单独调用子栏目模板和子栏目的文章时修改源代码给channel和chanenartllist加上limit

在网站文件中找到include-taglib-chanel.lib.php,和chaneartllist.lib.php 下载用php的IDE打开, chanel.php加入limit属性修改如下 <?php /** * 获取栏目列表标签 * * @version $Id: channel.lib.php 1 9:29 2010年7月6日Z tianya $ * @package DedeCMS.Taglib * @copyright Copyright (c) 2007 - 2010, Des

vue组件之间的通信以及如何在父组件中调用子组件的方法和属性

在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> <child v-bind:my-message="parentMsg"></child>//注意传递参数时要用-代替驼峰命名,HTML不区分大小写 </div> 子组件: Vue.component('child', { // camelCase in Ja