Lermontov 发表于 2013-5-30 10:54:32

支持汇编 这是我学习的零汇编后的进阶部分,支持的话就继续。

   第一天:这是我学习的零汇编后的进阶部分(在某个学习网站),支持的话就继续
      条件控制伪指令的格式

MASM 6.0引入.IF、.ELSEIF、.ELSE和.ENDIF伪指令,它们类似高级语言中IF、THEN、ELSE和ENDIF的相应功能。          .IF 条件表达式 ;条件为真(值为非0),执行分支体               分支体         [.ELSEIF 条件表达式 ;前面IF [以及前面ELSEIF] 条件为假(值为0),             ;并且当前ELSEIF条件为真,执行分支体               分支体 ]         [.ELSE ;前面IF [以及前面ELSEIF] 条件为假,             ;执行分支体               分支体 ]         .ENDIF ;分支结束                               条件表达式中的中操作符
操作符功能操作符功能操作符功能
==等于&&逻辑与CARRY?CF=1?
!=不等于||逻辑或OVERFLOW?OF=1?
> 大于!逻辑非PARITY?PF=1?
>=大于等于 SIGN?SF=1?
< 小于&位测试ZERO?ZF=1?
<=小于等于()改变优先级

                           







实例1
这些伪指令在汇编时自动生成相应的比较和条件转移指令序列,实现程序分支。 对于采用条件控制伪指令编写的双分支结构的源程序段:         .IF ax==5               mov bx,ax               mov ax,0         .ELSE               dec ax         .ENDIF查看其形成的列表.LST文件,如下所示(带有*号的语句是有汇编程序产生的):         .IF ax==5* cmp ax,05h* jne @C0001         mov bx,ax         mov ax,0         .ELSE* jmp @C0003*@C0001: dec ax         .ENDIF*@C0003:实例2
例5.1:用条件控制伪指令实现有根判断的源程序          .model small         .stack         .data _a      sbyte ? _b      sbyte ? _c       sbyte ? tag   byte ?         .code         .startup         mov al,_b         imul al         mov bx,ax ;bx中为b2         mov al,_a         imul _c         mov cx,4         imul cx ;ax中为4ac         .if sword ptr bx >= ax ;比较二者大小               mov tag,1 ;第一分支体:条件满足,tag←1         .else               mov tag,0 ;第二分支体:条件不满足,tag←0         .endif         .exit 0         end

凌海滨 发表于 2013-5-30 12:07:57

强烈支持楼主ing……

hide2may 发表于 2013-5-30 12:41:10

无回帖,不论坛,这才是人道。

Lermontov 发表于 2013-5-31 09:47:47

第二天   循环控制伪指令的格式
    条件表达式中的操作符
操作符        功能        操作符        功能        操作符        功能
==        等于        &&        逻辑与        CARRY?        CF=1?
!=        不等于        ||        逻辑或        OVERFLOW?        OF=1?
>        大于        !        逻辑非        PARITY?        PF=1?
>=        大于等于                      SIGN?        SF=1?
<        小于        &        位测试        ZERO?        ZF=1?
<=        小于等于        ()        改变优先级              










WHILE结构的循环控制伪指令的格式为:
         .WHILE 条件表达式 ;条件为真,执行循环体
               循环体
         .ENDW ;循环体结束

UNTIL结构的循环控制伪指令的格式为:
         .REPEAT ;重复执行循环体
               循环体
         .UNTIL 条件表达式 ;直到条件为真

UNTIL结构还有一种格式:
         .REPEAT ;重复执行循环体
               循环体
         .UNTILCXZ [条件表达式] ;cx←cx-1,直到cx=0或条件为真
例题实现1 ~ 100求和。

使用WHILE结构,可以编写为:
         xor ax, ax ;被加数AX清0
         mov cx,100
         .while cx!=0
               add ax,cx ;从100,99,...,2,1倒序累加
               dec cx
         .endw
         mov sum,ax ;将累加和送入指定单元

使用UNTIL结构,循环体部分也可以编写为:
         .repeat
               add ax,cx
               dec cx
         .until cx==0

使用UNTIL结构,循环体部分还可以编写为:
         .repeat
               add ax,cx
         .untilcxz
例:设array是100个字元素的数组,试计算其中前若干个非负数之和,直到出现第一个负数为止,并将结果存入result单元(不考虑进位和溢出)。

分析:由于已知array中最多有100个非负数,所以可以采用计数循环。循环开始前置循环计数器 CX为100,累加和清零。依题意,循环体内每取一个元素,都要判断其是否大于等于0,若是则累加,否则应立即退出整个循环。循环出口后将累加和存入result单元。

         .model small
         .stack
         .data
array sword 100 dup(?)
result sword ?
         .code
         .startup
         mov cx,100
         xor ax,ax
         lea bx,array
         .repeat
               .if sword ptr >= 0
                   add ax,
               .else
                   .break
               .endif
               inc bx
               inc bx
         .untilcxz
         mov result,ax
         .exit 0
         end

ゃ莼处狼性ぉ 发表于 2013-5-31 10:47:29

强烈支持楼主ing……
页: [1]
查看完整版本: 支持汇编 这是我学习的零汇编后的进阶部分,支持的话就继续。