汇编语言,此程序是求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,非要从汇编语言开始学么? 教材都是开始就讲汇编语言! 纠结
下一个:比较流行的计算机汇编语言和高级语言,帮忙列出来。