汇编语言入门:流程控制

流程控制:顺序,分支,循环

程序计数器PC中存储当前执行的程序在EM中的位置

汇编里面,用比较、跳转实现流程控制.

1.顺序:PC+1(不一定加一,看指令长度)

2.分支循环,直接赋给PC值,执行指定地址的程序

有时候需要程序有一定的流程控制能力,它不是老老实实按照顺序来执行的,中间可能会跳过一些代码

修改PC值,不可用MOV指令,PC是特殊的寄存器,特殊对待,跳转指令修改其值。

跳转指令:

 1 ja 大于时跳转
 2 jae 大于等于
 3 jb 小于
 4 jbe 小于等于
 5 je 相等
 6 jna 不大于
 7 jnae 不大于或者等于
 8 jnb 不小于
 9 jnbe 不小于或等于
10 jne 不等于
11 jg 大于(有符号)
12 jge 大于等于(有符号)
13 jl 小于(有符号)
14 jle 小于等于(有符号)
15 jng 不大于(有符号)
16 jnge 不大于等于(有符号)
17 jnl 不小于
18 jnle 不小于等于
19 jns 无符号
20 jnz 非零
21 js 如果带符号
22 jz 如果为零
1 a: above
2 e: equal
3 b: below
4 n: not
5 g: greater
6 l: lower
7 s: signed
8 z: zero

C语言的if语句:

int main() {
    int a = 50;
    if( a > 10 ) {
        a = a - 10;
    }
    return a;
}

其汇编程序:

global main

main:
    mov eax, 50
    cmp eax, 10                         ; 对eax和10进行比较
    jle xiaoyu_dengyu_shi            ; 小于或等于的时候跳转
    sub eax, 10
xiaoyu_dengyu_shi:
    ret
  • 第一条,cmp指令,专门用来对两个数进行比较
  • 第二条,条件跳转指令,当前面的比较结果为“小于或等于”的时候就跳转,否则不跳转

即:比较eax和10,eax小于等于10的时候,跳过中间的减法

  • C语言中:a大于10的时候,进入if块中执行减法
  • 汇编语言中:eax小于等于10的时候,跳过中间的减法

同样,比较a<10 a<=10 a==10 a>=10同理

C语言的while循环:

int sum = 0;
int i = 1;
while( i <= 10 ) {
    sum = sum + i;
    i = i + 1;
}

C语言中不使用循环怎么实现循环的功能:用跳转!

int sum = 10;
int i = 1;

_start:
if( i <= 10 ) {
    sum = sum + i;
    i = i + 1;
    goto _start;
}

变形:

1 if( a <= 10 ) goto out_of_block;
2
3 // some code
4
5 out_of_block:

if块里只需要放一条跳转语句即可

if里的条件是反过来的

跳转语句的功能是跳过“正宗C代码”的if块

int sum = 10;
int i = 1;

_start:
if( i > 10 ) {
    goto _end_of_block;
}

sum = sum + i;
i = i + 1;
goto _start;

_end_of_block:

为什么要变形?我们需要if块中都仅有一条goto语句!

逐行翻译为汇编:

global main

main:
    mov eax, 0
    mov ebx, 1
_start:
    cmp ebx, 10
    jg _end_of_block

    add eax, ebx
    add ebx, 1
    jmp _start

_end_of_block:
    ret

单条goto语句可以直接用jmp语句替代

if和goto组合的语句块可以用cmp和j*指令的组合替代

综上:

  汇编实现while

  • 将while循环拆解成只有if和goto的形式
  • 将if形式的语句拆解成if块中仅有一行goto语句的形式
  • 从前往后逐行翻译成汇编语言

do-while循环、for循环可转为while循环

感谢:https://zhuanlan.zhihu.com/p/23902265

时间: 2024-12-23 18:06:17

汇编语言入门:流程控制的相关文章

Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 原因是集成开发环境自带的版本为2.11.0 变量 常量(不可变)声明 val 变量声明 var 无参函数的调用也无需加括号() 定义有参有返回值的函数 def 函数名称(参数名称:参数类型...):返回值类型={ 函数体 } 老师代码 注意最后一个是b是本函数的返回值 默认最后一行为返回值 流程控

C#入门经典札记_Ch04流程控制

Chapter 04 流程控制 4.1 布尔逻辑 1.var1=var2^var3 ; (^异或运算符) 2.&和| 与 &&和||的区别: 结果都是一样的,但是&&和||性能更好,尽可能的使用&&与||. 4.1.1 位运算符 1.处理的是存储在变量中的一系列位,而不是变量的值. & . | .^ . ~ <<   // var1=var2<<var3 表示var2的二进制值向左移动var3位,后面补0 >&g

Scala深入浅出实战经典-----002-Scala函数定义、流程控制、异常处理入门实战

002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 原因是集成开发环境自带的版本为2.11.0 变量 常量(不可变)声明 val 变量声明 var 无参函数的调用也无需加括号() 定义有参有返回值的函数 def 函数名称(参数名称:参数类型...):返回值类型={ 函数体 } 老师代码 注意最后一个是b是本函数的返回值 默认最后一行为返回值 流程控

002-Scala函数定义、流程控制、异常处理入门实战

002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 原因是集成开发环境自带的版本为2.11.0 变量 常量(不可变)声明 val 变量声明 var 无参函数的调用也无需加括号() 定义有参有返回值的函数 def 函数名称(参数名称:参数类型...):返回值类型={ 函数体 } 老师代码 注意最后一个是b是本函数的返回值 默认最后一行为返回值 流程控

Perl入门(二)Perl的流程控制

Perl是一种粘性语言,如果你有其他语言的基础的话,你会发现他的流程控制完全和你所知的一模一样. 简单说一下他们的区别: Perl的elsif在其他语言里头可能表示为else if Perl的last,next在其他语言里头可能叫break和continue 不用找了,Perl中没有switch,其实这用if else也是可以实现的,不是么? Perl可能比你知道的语言里头多了这些:条件控制结构unless.循环控制结构until Perl还有一些特殊的写法 还是详细介绍一下Perl的流程控制吧

Python学习(二):入门篇:python中流程控制与函数编写

python中流程控制与函数编写 Last Eidt 2014/5/2 转载请注明出处http://blog.csdn.net/jxlijunhao 一,流程控制 1)布尔逻辑 Python中利用True来表示逻辑真,False来逻辑假 not :非 and:与 or   :或 ==  :逻辑等 >>> False==True False >>> False==False True >>> not False True >>> Fal

王家林亲传《DT大数据梦工厂》第二讲Scala函数定义、流程控制、异常处理入门

你想了解大数据,你想成为年薪百万吗?那你还等着什么,快点来吧!跟着王家林老师学习spark大数据 第二讲主要讲了Scala函数定义.流程控制.异常处理入门 函数定义: 关键字(def) 函数名称 参数(参数名称:参数类型):返回内容类型  =  { 函数体 } 注意: Unit:空的返回内容 Scala结束语是不需要写分号 下面一代码为例: //不带参数 Object  ScalaBasics{ def doWhile(){ var line = “” do{ line = readLine()

python入门之流程控制

python入门之流程控制 一.什么叫流程控制 所谓流程控制就是控制流程,具体指控制程序的执行流程,而执行流程分为三种结构:顺序结构(之前写的代码都是顺序结构),分支结构(用到if判断).循环结构(用where与for) 二.分支结构 2.1什么是分支结构 分支结构就是根据条件判断的真假去执行不同分支对应的子代码 2.2为什么要使用分支结构 程序中需要有相应的机制用来控制计算机具备人的判断能力 2.3如何使用分支结构 if 主要用来判断事物的对错,真假是否可行 如: 1.前面有一个小姐姐年龄在2

Go 从入门到精通(三)字符串,时间,流程控制,函数

一.strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判断字符串s是否以prefix开头 stirngs.HasSuffix(s string,suffix string) bool:判断字符串s是否以suffix结尾 strings.Index(s string,str string) int:判断str在s中首次出现的位置,如果没有出现,则返回-1 strings.LastIndex(s st