ds ?????
;最基本的字符串输入程序,需要具备下面的功能:;(1) 在输入的同时需要显示这个字符串;
;(2)一般在输入回车符后,字符串输入结束;
;(3)能够删除已经输入的字符。
;编写一个接收字符串的输入子程序,实现上面三个基本功能。
;因为在输入的过程中需要显示,子程序的参数如下:
; (dh)、(dl)=字符串在屏幕上显示的行、列位置;
; ds:si 指向字符串的存储空间,字符串以O 为结尾符。
assume cs:code
code segment
start:
call getstr
return:
mov ax,4c00h
int 21h
;完整的接收字符串输入的子程序
getstr:
push ax
getstrs:
mov ah,0
int 16h
cmp al,20h
jb nochar ;判断的是ASCII码小于0,说明不是字符
mov ah,0;
call charstack ;字符入栈
mov ah,2
call charstack ;显示栈中的字符
jmp getstrs
nochar:
cmp ah,0eh ;退格键的扫描码
je backspace
cmp ah,1ch ;回车键的扫描码
je enter
jmp getstrs
backspace: ;退格
mov ah,1
call charstack ;字符出栈
mov ah,2
call charstack ;显示栈中的字符
jmp getstrs
enter: ;回车
mov al,0
mov ah,0
call charstack ;0入栈
mov ah,2
call charstack ;显示栈中的字符
pop ax
ret ;getstr ends
;功能子程序实现
charstack:
jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ;栈顶
charstart:
push bx
push dx
push di
push es
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table
charpush:
mov bx,top
mov ,al
inc top
jmp sret
charpop:
cmp top,0
je sret
dec top
mov bx,top
mov al,
jmp sret
charshow:
mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx
mov bx,0
charshows:
cmp bx,top
jne noempty
mov byte ptr es:,' '
jmp sret
noempty:
mov al,
mov es:,al
mov byte ptr es:,' '
inc bx
add di,2
jmp charshows
sret:
pop es
pop di
pop dx
pop bx
ret
code ends
end start
haiouda 发表于 2014-9-25 11:56
上面程序第89行: mov ,al 提问?
1、si的值,是多少,前面为什么没有提前给si,赋值?
2、mov , ...
好久没看汇编代码了,好不容易真理了一下思路,我给你说一下吧。
第一个问题: si的值程序中确实没有指定值,那这时si里面的值就是上次某程序使用过后的值(也就是随机值),但是这并不会影响程序正常运行,si只是作为一个存放字符串的缓冲区偏移地址。
第二个问题:在没有给段地址的情况下,si默认的段地址就是ds
第三个问题:相必你也知道ret 是与 call 成对出现的,程序中 charpush,charpop,charshow 这3个子程序,都是调用133行 的ret与call 相匹配, 你仔细看看程序执行到62行的时候,当前程序还有那个call 没有ret 返回,看下是不是只有getstr 这个子程序没有返回,然后当程序执行玩63行ret的时候,肯定就回到了 call getstr下面的一行代码执行。。。 本帖最后由 haiouda 于 2014-9-25 12:42 编辑
上面程序第89行: mov ,al 提问?
1、si的值,是多少,前面为什么没有提前给si,赋值?
2、mov ,al,在没有给段地址的情况下,al是黙认,存到DS段,是这样子的吗?
3、第63行,ret ,执行完后,返回到到45行执行后,没跳到27行, 而是跳到第19行结束了程序,是如何做到的?
这个是实验几去了? xiaosawanjava 发表于 2014-9-25 17:28
好久没看汇编代码了,好不容易真理了一下思路,我给你说一下吧。
第一个问题: si的值程序中确实没有指 ...
谢谢,热心回复,我看懂你,你说得很明白,谢谢。
这个是17.3课
还有个问题,si没有提前赋值,所以si内可以是任意的;
89行 movmov ,al ,把lal 存到ds段内的某偏移地址;
98行 mov al, ,把存进去的,取出来,所以si,是什么没有什么关系;
我的问题是:
1、si即然没有提前赋值,si可以是任意的,即可以是ffff ,ds:(si)(bx) --->偏移溢出,这样会不会有不良结果?
2、即然si是任意的,整个ds段,内的偏移地址内容都可能被89行,改动,这样会不会影响到其它程序?
haiouda 发表于 2014-9-25 20:06
谢谢,热心回复,我看懂你,你说得很明白,谢谢。
这个是17.3课
1:假如si = FFFF ,这个时候如果在给si +1 的话 就会变成0 了,程序依然可以跑起来。
2 : 我觉得应该会影响其他程序,个人建议最好自己测试一下,一般如果自己能测试出来的,尽量自己测试,这样有利于你的学习。 haiouda 发表于 2014-9-25 20:06
谢谢,热心回复,我看懂你,你说得很明白,谢谢。
这个是17.3课
我好像忘记一个重点了,就是si 没有赋初值的话,一般都是 0 ,你自己测试看看,debug一下程序。 xiaosawanjava 发表于 2014-9-25 21:00
我好像忘记一个重点了,就是si 没有赋初值的话,一般都是 0 ,你自己测试看看,debug一下程序。
非常感谢:handshake
页:
[1]