haiouda 发表于 2014-9-25 11:53:32

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

xiaosawanjava 发表于 2014-9-25 11:53:33

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 11:56:38

本帖最后由 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 16:46:43

这个是实验几去了?

haiouda 发表于 2014-9-25 20:06:45

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行,改动,这样会不会影响到其它程序?

xiaosawanjava 发表于 2014-9-25 20:54:48

haiouda 发表于 2014-9-25 20:06
谢谢,热心回复,我看懂你,你说得很明白,谢谢。

这个是17.3课


1:假如si = FFFF ,这个时候如果在给si +1 的话 就会变成0 了,程序依然可以跑起来。
2 : 我觉得应该会影响其他程序,个人建议最好自己测试一下,一般如果自己能测试出来的,尽量自己测试,这样有利于你的学习。

xiaosawanjava 发表于 2014-9-25 21:00:36

haiouda 发表于 2014-9-25 20:06
谢谢,热心回复,我看懂你,你说得很明白,谢谢。

这个是17.3课


我好像忘记一个重点了,就是si 没有赋初值的话,一般都是 0 ,你自己测试看看,debug一下程序。

haiouda 发表于 2014-9-25 21:10:15

xiaosawanjava 发表于 2014-9-25 21:00
我好像忘记一个重点了,就是si 没有赋初值的话,一般都是 0 ,你自己测试看看,debug一下程序。

非常感谢:handshake
页: [1]
查看完整版本: ds ?????