汇编流程控制

原创 2013年12月03日 19:50:29
;**************************************************************
TITLE 取得三个数的最小值
;**************************************************************


;**************************************************************
;the process required platform
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
;**************************************************************

;**************************************************************
;the file included
INCLUDE Irvine32.inc
;**************************************************************


;**************************************************************
;the data segment
.DATA
var_1 byte 2;
var_2 byte 74
var_3 byte 45;
;**************************************************************

;**************************************************************
;code segment
.CODE
;get the largest
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;首先比较var_1和var_2较大的放在al当中,然后和var_3比较
CMPproc proc
  mov al,var_1
  cmp al,var_2;
  ja M1;
  mov al,var_2  
  M1:;
  cmp al,var_3  
  ja M3;  
  mov al,var_3;
  M3:
  ret;
CMPproc endp
main proc
   xor eax,eax
   call CMPproc;
   call WriteInt
   exit
main endp
end main

;**************************************************************



;**********************************************************
TITLE 查找数组当中小于0的元素
;**********************************************************


;**********************************************************
;程序运行平台说明
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
;**********************************************************

;**********************************************************
;文件包含
INCLUDE Irvine32.inc
;**********************************************************

;**********************************************************
;数据段定义
.DATA
filterByte byte 0,25,-87,24,24,45,0
arraySize byte $-filterByte
strEnter byte 0dh,0ah ,0
;**********************************************************


;**********************************************************
;代码段定义
.CODE

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;函数描述:从全局数组中filterByte寻找大于0的元素,输出
;返回值:无
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

FindAboveZero proc uses ecx edx eax
   movzx ecx,arraySize;
   xor eax,eax
   xor esi,esi
   FindLabel:
   mov al,filterByte[esi]
   cmp al,0
   js Continue;
   call WriteInt;
   mov edx,offset strEnter
   call WriteString
   Continue:
      inc esi   
   loopd FindLabel;   
   ret
FindAboveZero endp
main proc
  call FindAboveZero
  exit
main endp
end main
;**********************************************************

;******************************************************************
TITLE 找到数组中第一个不是0的数字
;******************************************************************

;******************************************************************
;程序运行平台
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
;******************************************************************


;******************************************************************
;文件包含
INCLUDE Irvine32.inc
;******************************************************************


;******************************************************************
.DATA
arrayB byte 0,12,45,78,32,-89,0
arrayBSize byte $-arrayB
;******************************************************************



;******************************************************************
;代码段

.CODE
;------------------------------------------------------------------
;函数描述:寻找arrayB数组中第一个不为0的元素
;函数参数:ecx,esi
;返回值:无
FindFirstNon proc uses ecx esi
   mov ecx,length arrayB;
   xor esi,esi
   L1:
     mov al,arrayB[esi]
     test arrayB[esi],al
     pushfd
     add esi,type arrayB
     popfd
   loopnz L1;如果ecx>0并且
   jnz quit
   sub esi,type arrayB
   movzx eax,arrayB[esi];
   call WriteInt
   quit:
   ret;
FindFirstNon endp
;------------------------------------------------------------------
main proc
main endp
   call FindFirstNon
   exit
   ret;
end main
;******************************************************************

PS解读:

loopn 指令的含义是当ecx>0并且当标志寄存器zf==1时




;************************************************************
TITLE 表格的分支调用
;************************************************************


;************************************************************
;程序运行平台说明
.386
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
;************************************************************



;************************************************************
;文件包含
INCLUDE Irvine32.inc
;************************************************************

;************************************************************
;数据段定义
.DATA
msg1 byte "you called the process1",0dh,0ah,0
msg2 byte "you called the process2",0dh,0ah,0
msg3 byte "you called the process3",0dh,0ah,0
msg4 byte "you called the process4",0dh,0ah,0
msg5 byte "please input the 'A' 'B' 'C'  'D'",0dh,0ah,0
msgerror byte "you have input the wrong char",0dh,0ah,0
ProcessTable         byte 'A'
process_1            dword ?
                     byte 'B'
process_2             dword ?
                     byte 'C'
process_3             dword ?
                      byte 'D'
process_4             dword ?
;************************************************************


;************************************************************
;代码段
.CODE
process1 proc uses edx
   mov edx,offset msg1;
   call WriteString
   ret;
process1 endp


process2 proc uses edx
   mov edx,offset msg2;
   call WriteString
   ret;
process2 endp


process3 proc uses edx
   mov edx,offset msg3;
   call WriteString
   ret;
process3 endp


process4 proc uses edx
   mov edx,offset msg4
   call WriteString
   ret;
process4 endp
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;函数描述:根据用户输入的字符调用对应的函数
;函数参数:无
;函数返回值:无
FindRightFunction proc uses edx eax esi
    mov edx,offset msg5
    call WriteString
    ;读取的字符放在al当中,然后进行比较
    call ReadChar
    mov ecx,4;
    mov esi, offset ProcessTable;esi变化的步长是5
    L1:
        cmp [esi],al
        jz L2;
        jmp L3
        L2:
          inc esi;
          call dword ptr[esi]
          jmp L4;
        L3:
          add esi,5
    loopd L1;
    mov edx,offset msgerror
    call WriteString
    L4:
    ret;
FindRightFunction endp
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
main proc
   ;首先将各函数地址赋值给各变量
   mov process_1,process1;
   mov process_2,process2;
   mov process_3,process3
   mov process_4,process4  
   call FindRightFunction
   exit
main endp
end main
;************************************************************

C语言流程控制语句的反汇编分析

以下测试是在vc6.0下进行的,主要有if、switch、for、while、do...while,下面依次分析: 1、if 20: if(x == 0) 00401078 c...

c++反汇编学习笔记----------3.流程控制

一、 条件表达式: 表达式1?表达式2:表达式3 1. 当表达式1为等值比较,表达式2和3都为常数/可以优化为常数且差值为1时,编译器会通过setne指令进行平衡 2. 当表达式1为等值比...

汇编中精妙的流程控制

汇编中精妙的流程控制   前言 今天一天挺废啊,百无聊赖啊,唉,也不想学习,看了一天的电视了,不过好在我还是想看看OS中的东西,这次咱们一起来看看一个特别有趣的内容,就是...

反汇编之流程控制语句的识别(if语句)

if 语句的功能是先对运算条件进行比较,然后根据比较结果选择对应的语句来执行。if 语句只能判断两种情况: “0” 为假,“非0”为真。如果为真,则进入语句块内执行语句; 如果为假, 则跳过 if 语...
  • HK_5788
  • HK_5788
  • 2015年03月23日 23:09
  • 931

深入理解计算机系统(3.6)---汇编中精妙的流程控制(重要)(难度较高)

引言     最近LZ有些略忙,因此这一章拖的时间有点久,不知道有没有猿友在跟着看呢,LZ觉得应该几乎没有吧。毕竟这实在是一本乍一看十分枯燥的书,不过随着慢慢的深入,不知道有没有猿友慢慢找到了一点...

C++考试流程控制语句

  • 2017年03月06日 13:02
  • 95KB
  • 下载

Mysql之流程控制语句

这篇博客主要是总结一下Mysq中的流程控制语句的用法,主要是:CASE,IF,IFNULL,NULLIF...

流程控制PPT

  • 2014年12月13日 16:26
  • 2.91MB
  • 下载

java流程控制

  • 2014年12月08日 08:50
  • 934KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编流程控制
举报原因:
原因补充:

(最多只允许输入30个字)