汇编流程控制

原创 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
;************************************************************

汇编控制指令

1. GNU ARM 汇编简介     任何汇编行都是如下结构: [:] [} @ comment [:] [} @ 注释        GNU ARM 汇编中,任何以冒号结尾的...
  • li6322511
  • li6322511
  • 2015年11月06日 11:31
  • 355

汇编语言入门五:流程控制(一)

回顾 前面说到过这样几个内容: 几条简单的汇编指令 寄存器 内存访问 对应到C语言的学习过程中,无非就是这样几个内容: 超级简单的运算 变量 好了,到这里,...
  • CNHK1225
  • CNHK1225
  • 2017年08月21日 18:29
  • 217

AT&T 汇编控制执行流程及与高级语言的转换

注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚! ...
  • guzhou_diaoke
  • guzhou_diaoke
  • 2012年12月21日 21:15
  • 1953

node.js promise 流程控制

promise 一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理。关于详细的说明文档可以参考 Promises/A+ 。目前实现 promise 标准的模块有很多,如 Q 、 blue...
  • shmnh
  • shmnh
  • 2015年02月17日 23:16
  • 2119

SQL之流程控制

分为变量声明、流程控制、数据操纵、数据控制、内嵌函数和自定义函数 1:局部变量的声明和赋值      Declare @变量名 变量类型     可以声明一个或者多个变量...
  • woshisap
  • woshisap
  • 2012年03月14日 14:05
  • 1908

C语言中的流程控制深入理解

1.流程控制内容的实质 流程控制的本质就是讲解7个关键字的用法,即if\switch\for\While\do……while\break\continue的具体用法 2.简述流程控制内容的重要性 1>...
  • a2011480169
  • a2011480169
  • 2016年08月15日 19:19
  • 541

流程控制(面向对象篇)

流程控制语句主要包括顺序语句,选择语句,循环语句以及跳转语句。 顺序结构:顺序结构是程序中最常见的流程结构,语句按照出现的先后顺序自上而下依次执行。顺序语句执行的过程中没有跳转和选择,直到程序结束为...
  • zyf__java
  • zyf__java
  • 2016年04月23日 13:30
  • 737

linux——shell流程控制

每种语言都有自己的流程控制,判断语句、循环语句。shell和他们一样,if判断、for、while循环等。 if判断:          if 判断条件          then      ...
  • u012201343
  • u012201343
  • 2015年09月02日 22:14
  • 517

js三大流程控制

1.顺序控制 2.分支控制 分支控制  if  else var sex=window.prompt("请输入性别");   if(sex=="男"){       ...
  • lf1218
  • lf1218
  • 2016年04月20日 11:10
  • 4120

JAVA基础知识: 流程控制习题答案

第一题: 有 36 人 36 块板砖,男人每人般 4 块,女人每人搬 3 块,小孩每 2 人搬 1 块。36 人都搬了一次,把砖刚好搬晚,问:几男几女的几个小孩? int na...
  • Spark2008
  • Spark2008
  • 2015年03月23日 09:19
  • 1742
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编流程控制
举报原因:
原因补充:

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