请问这一段汇编程序是什么意思?并回答程序后的问题.

来源:百度知道 编辑:UC知道 时间:2024/06/27 15:25:40
DATA SEGMENT
STR DB “abcdef123456”,-1
LEN DW ?
DATA ENDS
STAK SEGMENT
DB 128 DUP(?)
STAK ENDS

CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS:STAK
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STAK
MOV SS, AX

LEA SI, STR
CALL SCONT

MOV LEN, BX
MOV AH, 4CH
INT 21H
SCONT PROC NEAR
PUSH SI
XOR BX, BX
MOV SI, BX
NEXT:
CMP BYTE PTR[SI],-1
JZ OVER
INC BX
INC SI
JMP NEXT
OVER:
POP SI
RET
SCONT ENDP
CODE ENDS
END START

1、 请试着改变字符串“abcdef123456”(注意不要改变该字符串后的-1),结合存储器中数据段LEN值的变化,分析此程序主要功能是什么?
2、 本程序中的一个子程序是用来实现什么功能的?请画出调用此子程序前后堆栈段的数据变化情况。(请注意此子程序是段内调用!)
3、请试着将该程序中的子程序调用改成段间调用。并画出段间调用子程序前

DATA SEGMENT //定义段DATA
STR DB “abcdef123456”,-1 //符号地址STR内存放单字节数据
//(共占用13 个单元):“abcdef123456”,-1
LEN DW ? //为符号地址LEN保留一个字的空间
//(即保留两个字节)
DATA ENDS //DATA段结束
STAK SEGMENT //定义段STAK
DB 128 DUP(?) //为堆栈段保留128个字节
STAK ENDS //STAK段结束

CODE SEGMENT //定义段CODE
ASSUME CS: CODE, DS: DATA, SS:STAK //规定CODE为代码段;
//DATA为数据段;STAK为堆栈段
START: //开始标记
MOV AX, DATA //将数据段首址存入AX寄存器
MOV DS, AX //将AX寄存器的值存入数据段奇存器DS(与上面行
//一起,实现为DS段寄存器赋初值,使DS指向数据
//数首地址,也就是符号STR代表的地址,里面存
//放着“a”)
MOV AX, STAK //与下面一行结合,为堆栈段寄存器SS赋初值,功
//能类似于上面两行
MOV SS, AX

LEA SI, STR //将STR的地址赋给源指针SI(即存放“a”的地址)
CALL SCONT //调用子程序scont

MOV LEN, BX //子程序结束后将计数器BX的值存入符号地址LEN
MOV AH, 4CH //将16进制数4C存入AH,AH里的数用于指明DOS调用