当前位置:编程学习 > 汇编语言 >>

汇编语言,此程序是求4个数6,88,13,46的和,求解释

DATA SEGMENT SUM DW ? FIRST DW 6,88,13,46 DATA ENDS SSEGG SEGMENT STE DW 6DUP(?) TOP EOQ LENGTH STE SSEG ENDS ;以下为子程序 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:SSEG SU PROC FAR PUSH SI MOV SI ,0 XOR AX,AX NEXT: ADC AX[BX][SI] INC SI INC SI LOOP NEXT POP SI PET SU ENDP CODE ENDS ;以下为主程序 CLR SEGMENT ASSUMENT CS:CLR,DS:DATA,SS:SSEG START: MOVE AX,DATA MOVE DS,AX MOVE AX , SSEG MOVE SS ,AX MOVE AX , TOP MOVE SP, AX MOVE CX,4 MOVE BX,OFFSET FIRST CALL SU MOVE SUM ,AX MOV AH,4CH INT 21H CLR ENDS END START 问题: 1.程序执行到子程序时,当遇到 PROC,像C语言一样,直接跳过,执行主程序,也像C语言一样,子程序放在主程序后面得声明; 2.主程序怎么用到的SI寄存器 3。 ADC AX,[BX][SI] 的意思,尤其是,[BX][SI] 4. 主程序里的BX里面的值怎么跑到SI里了 谢谢回答好加分
追问:书上说主程序用到SI了,所以用子程序用push,pop保护
答案:1. 和数据 定义一样。。 但是入口程序必须放在后面,这个没比较解释了吧。。
2.主程序怎么用到si寄存器。 因为他可以用不足够就使用他暂存 或者做栈的导向。
3.ADC AX,[BX][SI]  
adc ax,[BX][SI]的作用是:ax:=ax+[BX][SI] +cf   , cf 是进位标志
相当于一个双向指针。 ds:[bx] :[SI] 的作用
ds:[bx] 内的值当做基址 [si]偏移量;
这样叫做间接寻址。
4.怎么跑到si里面 Bx 原因就是根本没有跑。。
   
看这样就知道是什么了 定义了一个数组变量
            MOV    SI ,0    //数组的偏移是0
            XOR    AX,AX  //影响了标致cf
NEXT:  ADC    AX[BX][SI] //[bx] 保存了一个数组的基地址  因为ADC 是  AX+[BX][SI]+cf赋值给AX  
            INC     SI //双字节类型所以递增了两次
            INC     SI
            LOOP  NEXT
这样就是一个数组放了几个值 。。  然后把他们加起来了!!
其他:楼主的程序,错误不少,修改如下,才能通过编译:

DATA  SEGMENT
SUM    DW ?
FIRST  DW 6, 88, 13, 46
DATA   ENDS

SSEG   SEGMENT
STE    DW 16 DUP(?)
TOP    EQU LENGTH STE
SSEG   ENDS

           ;以下为子程序
CODE   SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:SSEG
SU  PROC  FAR
    PUSH  SI
    MOV   SI, 0
    XOR   AX, AX
NEXT:
    ADC   AX, [BX][SI]
    INC   SI
    INC   SI
    LOOP  NEXT
    POP   SI
    RET
SU  ENDP
CODE  ENDS
           ;以下为主程序
CLR   SEGMENT
    ASSUME CS:CLR,DS:DATA,SS:SSEG
START:
    MOV  AX, DATA
    MOV  DS, AX
    MOV  AX, SSEG
    MOV  SS, AX
    MOV  AX, TOP
    MOV  SP, AX
    MOV  CX, 4
    MOV  BX, OFFSET FIRST
    CALL SU
    MOV  SUM, AX
    MOV  AH, 4CH
    INT  21H
CLR   ENDS
    END   START

上述程序可以正常运行,程序的结果要用DEBUG来观看。
问题:
1.程序执行到子程序时,当遇到 PROC,像C语言一样,直接跳过,执行主程序,也像C语言一样,子程序放在主程序后面得声明;
PROC  和 ENDP,是定义“过程(也可以称为子程序)”的伪指令,它们确实不被CPU执行。
过程,放在前面、后面均可,不用像C语言那样笨,放在后面,并不用在前面声明。

2.主程序怎么用到的SI寄存器
主程序并没有用到SI。

3. ADC   AX,[BX][SI] 的意思,尤其是,[BX][SI] 
主程序用BX向子程序送去了一个数据的起始地址。
子程序中,用SI当做变量,开始令其为零,处理一次,就加上2。
ADC   AX,[BX][SI] 可以等效写成ADC   AX,[BX+SI],那么:
[BX+0]、[BX+2]、..,括号中的就是一个个数据的地址。
ADC,是带进位加,循环多次,就把这一个个的数,都加到AX中了。

4. 主程序里的BX里面的值怎么跑到SI里了
BX,并没有和SI发生关系。
SI,开始令其为零,处理一次,就加上2。 尼马,老zi提交一个回答,贱-货百度要了老zi的一条命! 

----------------------------时间分割线------------------------

咦,还真是贱,不骂不显示...汗... 

上一个:学习DSP,非要从汇编语言开始学么? 教材都是开始就讲汇编语言! 纠结
下一个:比较流行的计算机汇编语言和高级语言,帮忙列出来。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,