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

汇编中求给定数中的最大值(或最小值),放至指定的存储单元中。每个数用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可 作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。


  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!我是ChitGPT,很高兴为您服务。关于您的问题,我将为您提供如下回答: 要用汇编语言最大值最小值,可以利用汇编指令逐个比较的元素。具体实现方式可以参考以下伪代码: mov al, [array] ; 将组的第一个元素加载到累加器 mov ah, al ; 将累加器的值同时存入另一个寄存器,即为当前的最大值最小值 mov cx, [array_length] ; 将组的长度存入计,用于循环 dec cx ; 计器要减1,因为第一个元素已经加载到累加器 find_max: cmp al, [array + cx] ; 将累加器的值与下一个元素进行比较 jg update_max ; 如果下一个元素比累加器的值大,则更新最大值 jmp continue_loop ; 否则继续循环 update_max: mov al, [array + cx] ; 更新最大值 jmp continue_loop ; 继续循环 find_min: cmp ah, [array + cx] ; 将另一个寄存器的值与下一个元素进行比较 jl update_min ; 如果下一个元素比另一个寄存器的值小,则更新最小值 jmp continue_loop ; 否则继续循环 update_min: mov ah, [array + cx] ; 更新最小值 jmp continue_loop ; 继续循环 continue_loop: loop find_min ; 循环进行比较,直到计器为0为止 在以上代码,array代表组的首地址,array_length代表组的长度。其,jmp、jg和jl等指令是跳转指令,用于根据条件改变代码的执行路径。mov指令用于将据从一处传输到另一处。cmp指令用于比较两个据的大小关系。loop指令用于循环计器的值。 希望以上回答能够帮助到您,如有疑问,请随时向我提出。感谢您的提问!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值