汇编高手进,关于字符串存储的问题。100分奉上!
我要编写一个学生成绩录入的程序,刚刚开头。我编写到了录入程序的步骤,是一开始。可是,1.我不知道要怎么把录入的信息存储进去,就是存到哪里,存到内存的什么地方。还有,2.我...
我要编写一个学生成绩录入的程序,刚刚开头。我编写到了录入程序的步骤,是一开始。可是,1.我不知道要怎么把录入的信息存储进去,就是存到哪里,存到内存的什么地方。还有,2.我的这个程序不能用0ch中断清空缓存区,总是有残留。再来一个问题,3.为什么输入字符串在DATA里面要定义30个('$')才可以正常使用,我只加了一个就会报错。最后一个问题,4.为什么要用堆栈来写呢?一定的吗?
希望高手详细的回答我的问题。不要随便的粘贴。我是很认真的想学习的。谢谢了。
以下是我的程序:
data segment
buf db 30, ?, 30 dup('$') //为什么要30个('$')?
data ends
stack segment para 'stack' stack //用的到STACK吗?
db 200 dup( 0 )
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 10
Input: lea dx, buf
mov ah, 0ah
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
lea dx, buf
add dx, 2
mov ah, 9
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
dec cx
cmp cx,0
mov ah,0ch
mov al,06h
int 21h
jne Input //不会清空缓存啊,前几次还正确,后面就不对了,会和前面有交集。
Exit: mov ah, 4ch
int 21h
code ends
end begin
//怎么存储进去啊,存在哪里? 展开
希望高手详细的回答我的问题。不要随便的粘贴。我是很认真的想学习的。谢谢了。
以下是我的程序:
data segment
buf db 30, ?, 30 dup('$') //为什么要30个('$')?
data ends
stack segment para 'stack' stack //用的到STACK吗?
db 200 dup( 0 )
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 10
Input: lea dx, buf
mov ah, 0ah
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
lea dx, buf
add dx, 2
mov ah, 9
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
dec cx
cmp cx,0
mov ah,0ch
mov al,06h
int 21h
jne Input //不会清空缓存啊,前几次还正确,后面就不对了,会和前面有交集。
Exit: mov ah, 4ch
int 21h
code ends
end begin
//怎么存储进去啊,存在哪里? 展开
展开全部
1.录入的信息存储在内存Buf中
2.根本没必要调用0ch
3.只加了一个就会报错:buf db 30, ?, 30 dup('$'),其中第一个字节里面的30表示buf可接受的最大字符数(包括回车在内),第二个字节"?"表示实际输入的字符数,有0ah自动填入,后面定义了30个字节的空间,注意前面定义的最大字符数是30,所以你后面不可能定义31个字符空间吧?不知你懂不懂.
4.不一定用堆栈,看程序需要.可以删除.
修改后不管多少次都能正确,如下:
data segment
buf db 30, ?, 30 dup('$') //为什么要30个('$')?
data ends
stack segment para 'stack' stack //用的到STACK吗?
db 200 dup( 0 )
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 10
Input: lea dx, buf
mov ah, 0ah
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
lea dx, buf
add dx, 2
mov ah, 9
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
//我加入的代码从这开始,没有调试,一般没问题,很久以来写程序都不打草稿了,见谅
push cx
cld
push ds
pop es
lea di,buf
add di,2
mov cx,30
mov al,'$'
rep stosb
pop cx
dec cx
cmp cx,0
jne Input //不会清空缓存啊,前几次还正确,后面就不对了,会和前面有交集。
Exit: mov ah, 4ch
int 21h
code ends
end begin
2.根本没必要调用0ch
3.只加了一个就会报错:buf db 30, ?, 30 dup('$'),其中第一个字节里面的30表示buf可接受的最大字符数(包括回车在内),第二个字节"?"表示实际输入的字符数,有0ah自动填入,后面定义了30个字节的空间,注意前面定义的最大字符数是30,所以你后面不可能定义31个字符空间吧?不知你懂不懂.
4.不一定用堆栈,看程序需要.可以删除.
修改后不管多少次都能正确,如下:
data segment
buf db 30, ?, 30 dup('$') //为什么要30个('$')?
data ends
stack segment para 'stack' stack //用的到STACK吗?
db 200 dup( 0 )
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 10
Input: lea dx, buf
mov ah, 0ah
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
lea dx, buf
add dx, 2
mov ah, 9
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
//我加入的代码从这开始,没有调试,一般没问题,很久以来写程序都不打草稿了,见谅
push cx
cld
push ds
pop es
lea di,buf
add di,2
mov cx,30
mov al,'$'
rep stosb
pop cx
dec cx
cmp cx,0
jne Input //不会清空缓存啊,前几次还正确,后面就不对了,会和前面有交集。
Exit: mov ah, 4ch
int 21h
code ends
end begin
展开全部
1.
存储在内存数据段BUF内
4.
关于堆栈不是必须定义的,如果你程序里PUSH/POP操作不多,可以用系统堆栈而不定义自己的堆栈段,如果你使用PUSH/POP频繁,如采用了递归算法等,此时若不定义自己的堆栈段,很有可能造成堆栈溢出.
2.3.
关于要定义30个('$')才可以正常使用及0C功能调用
0C号DOS系统功能调用不必用,实际上只要动态向输入字符串末加上"$"即可
你出现此问题的原因是第二次输入的串长度大于第一次,使得串末节的'$'被覆盖了,而下次显示信息(用INT 21的09号功能)时DX需要指向一个以"$"结尾的数据串.
解决办法是动态加上'$"符号,因为你输入串长是动态的.如下代码所示:
Input: lea dx, buf
mov ah, 0ah
int 21h
MOV SI,OFFSET BUF
INC SI;
MOV CL,[SI] ;输入的实际数量放CX
MOV CH,0
INC SI ;SI指向数据区首地址
ADD SI,CX ;SI指向输入数据末
MOV [SI],"$"
;写入'$'符号供09号DOS系统功能调用使用
data segment
org 3000h
buf db 30, ?, 30 dup('0') ;注意此处改为0或?都行
data ends
stack segment para 'stack' stack
db 200 dup( 0 ) ;本程序用系统堆栈也可
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 10
Input: lea dx, buf
mov ah, 0ah
int 21h ;输入串
MOV SI,OFFSET BUF
INC SI;
push cx
MOV CL,[SI] ;输入的实际数量放CX
MOV CH,0
INC SI ;SI指向数据区首地址
ADD SI,CX ;SI指向输入数据末
MOV [SI],"$"
pop cx
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
lea dx, buf
add dx, 2
mov ah, 9
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
dec cx
cmp cx,0
jne Input
Exit: mov ah, 4ch
int 21h
code ends
end begin
存储在内存数据段BUF内
4.
关于堆栈不是必须定义的,如果你程序里PUSH/POP操作不多,可以用系统堆栈而不定义自己的堆栈段,如果你使用PUSH/POP频繁,如采用了递归算法等,此时若不定义自己的堆栈段,很有可能造成堆栈溢出.
2.3.
关于要定义30个('$')才可以正常使用及0C功能调用
0C号DOS系统功能调用不必用,实际上只要动态向输入字符串末加上"$"即可
你出现此问题的原因是第二次输入的串长度大于第一次,使得串末节的'$'被覆盖了,而下次显示信息(用INT 21的09号功能)时DX需要指向一个以"$"结尾的数据串.
解决办法是动态加上'$"符号,因为你输入串长是动态的.如下代码所示:
Input: lea dx, buf
mov ah, 0ah
int 21h
MOV SI,OFFSET BUF
INC SI;
MOV CL,[SI] ;输入的实际数量放CX
MOV CH,0
INC SI ;SI指向数据区首地址
ADD SI,CX ;SI指向输入数据末
MOV [SI],"$"
;写入'$'符号供09号DOS系统功能调用使用
data segment
org 3000h
buf db 30, ?, 30 dup('0') ;注意此处改为0或?都行
data ends
stack segment para 'stack' stack
db 200 dup( 0 ) ;本程序用系统堆栈也可
stack ends
code segment
assume cs:code, ds:data, ss:stack
begin:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 10
Input: lea dx, buf
mov ah, 0ah
int 21h ;输入串
MOV SI,OFFSET BUF
INC SI;
push cx
MOV CL,[SI] ;输入的实际数量放CX
MOV CH,0
INC SI ;SI指向数据区首地址
ADD SI,CX ;SI指向输入数据末
MOV [SI],"$"
pop cx
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
lea dx, buf
add dx, 2
mov ah, 9
int 21h
mov dl, 13
mov ah, 2
int 21h
mov dl, 10
int 21h
dec cx
cmp cx,0
jne Input
Exit: mov ah, 4ch
int 21h
code ends
end begin
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上牛人哦
我留个记号,以备日后查询,楼主莫怪 ^_^
我留个记号,以备日后查询,楼主莫怪 ^_^
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询