Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

汇编中求给定数中的最大值(或最小值)

$
0
0

汇编中求给定数中的最大值(或最小值),放至指定的存储单元中。每个数用16位表示


NAME  SEARCH_MAX

DATA  SEGMENT

BUFFER   DW    X1,X2,...Xn         ;定义一个一组数为字型数16位

COUNT  EQU    $-BUFFER

MAX     DW            ?  ;为那个最大数预留空间

DATA      ENDS    ;数据段结束

STACK            SEGMENT  PARA    STACK ‘STACK’

                         DB           64  DUP(?)  ;给堆栈段分配64个字节,没有说明内容

TOP               EQU          $-STACK

STACK          ENDS    ;堆栈段定义结束

CODE             SEGMENT

START            PROC   FAR  ;定义为一个远过程

                        ASSUME     CS:CODE,DS:DATA,SS:STACK

BEGIN:    PUSH                       DS

                    MOV                         AX,0

                    PUSH                       AX

                   MOV                           AX,DATA

                    MOV                           DS,AX  ;将AX寄存器的内容存放到DS段寄存器中

                    MOV                           AX,STACK

                   MOV                            SS,AX ;SS存放栈的段地址

                    MOV                          AX,TOP

                   MOV                           SP,AX;存放栈的偏移地址,指向栈的顶部

                    MOV                           CX,COUNT  ;用CX作为循环的计数器

                    LEA                            BX,  BUFFER   ;将BUFFER 的地址存放到BX寄存器中

                   MOV                           AX ,[BX]   ;将BX所在的地址存放的内容放至AX寄存器中

                INC                                BX   ;使BX的地址每次都向后一位,用于比较下一次

               DEC                               CX  ;循环每次减一

             AGAIN:                                      CMP      AX,[BX];用于比较AX寄存器中的内容和BX所在地址的内容大小

                                                     JGE            NEXT;  如果结果大于或等于0则跳转到下一个循环

                                                   MOV            AX,[BX] ;若结果小于它,则交换两个寄存器的内容

NEXT:                                   INC            BX  ;指向下一个地址

                                                LOOP            AGAIN ;循环一次就减一次

START                                    ENDP   ;这个过程结束

CODE                                      ENDS  ;代码段到此结束

                                                    END              BEGIN ;整个程序到此结束


 SS, SP, BP 三个寄存器


SS:存放栈的段地址;
SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址;

BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.一般除了保存数据外,可以作为指针寄存器用于存储器寻址,此时它默认搭配的段寄存器是SS-堆栈段寄存器.BP是16位的,再扩充16位就是EBP,用于32位编程环境的.一般高级语言的参数传递等等,转换为汇编后经常由BP/EBP来负责寻址\处理.

SP,BP一般与段寄存器SS 联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可 作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。


作者:xiongyaoqiongyao 发表于2012-12-28 20:43:41 原文链接
阅读:48 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles