鱼C论坛

 找回密码
 立即注册
查看: 2200|回复: 7

ds ?????

 关闭 [复制链接]
发表于 2014-9-25 11:53:32 | 显示全部楼层 |阅读模式
2鱼币
;最基本的字符串输入程序,需要具备下面的功能:
;(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[bx]

charpush:
        mov bx,top
        mov [si][bx],al
        inc top
        jmp sret

charpop:
        cmp top,0
        je sret
        dec top
        mov bx,top
        mov al,[si][bx]        
        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:[di],' '        
        jmp sret

noempty:
        mov al,[si][bx]
        mov es:[di],al
        mov byte ptr es:[di+2],' '
        inc bx
        add di,2
        jmp charshows

sret:        
        pop es
        pop di
        pop dx
        pop bx
        ret

code ends

end start

最佳答案

查看完整内容

好久没看汇编代码了,好不容易真理了一下思路,我给你说一下吧。 第一个问题: si的值程序中确实没有指定值,那这时si里面的值就是上次某程序使用过后的值(也就是随机值),但是这并不会影响程序正常运行,si只是作为一个存放字符串的缓冲区偏移地址。 第二个问题:在没有给段地址的情况下,si默认的段地址就是ds 第三个问题:相必你也知道ret 是与 call 成对出现的,程序中 charpush,charpop,charshow 这3个子程序,都 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-25 11:53:33 | 显示全部楼层
haiouda 发表于 2014-9-25 11:56
上面程序第89行: mov [si],al 提问?
1、si的值,是多少,前面为什么没有提前给si,赋值?
2、mov [si], ...

好久没看汇编代码了,好不容易真理了一下思路,我给你说一下吧。
第一个问题: si的值程序中确实没有指定值,那这时si里面的值就是上次某程序使用过后的值(也就是随机值),但是这并不会影响程序正常运行,si只是作为一个存放字符串的缓冲区偏移地址。

第二个问题:在没有给段地址的情况下,si默认的段地址就是ds

第三个问题:相必你也知道ret 是与 call 成对出现的,程序中 charpush,charpop,charshow 这3个子程序,都是调用133行 的ret  与call 相匹配, 你仔细看看程序执行到62行的时候,当前程序还有那个call 没有ret 返回,看下是不是只有getstr   这个子程序没有返回,然后当程序执行玩63行ret的时候,肯定就回到了 call getstr  下面的一行代码执行。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-25 11:56:38 | 显示全部楼层
本帖最后由 haiouda 于 2014-9-25 12:42 编辑

上面程序第89行: mov [si][bx],al 提问?
1、si的值,是多少,前面为什么没有提前给si,赋值?
2、mov [si][bx],al  ,在没有给段地址的情况下,al是黙认,存到DS段,是这样子的吗?
3、第63行,ret ,执行完后,返回到到45行执行后,没跳到27行,   而是跳到第19行结束了程序,是如何做到的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-25 16:46:43 | 显示全部楼层
这个是实验几去了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-25 20:06:45 | 显示全部楼层
xiaosawanjava 发表于 2014-9-25 17:28
好久没看汇编代码了,好不容易真理了一下思路,我给你说一下吧。
第一个问题: si的值程序中确实没有指 ...

谢谢,热心回复,我看懂你,你说得很明白,谢谢。

这个是17.3课
还有个问题,si没有提前赋值,所以si内可以是任意的;
89行 mov  mov [si][bx],al   ,把lal 存到ds段内的某偏移地址;
98行 mov al,[si][bx]             ,把存进去的,取出来,所以si,是什么没有什么关系;

我的问题是:
1、si即然没有提前赋值,si可以是任意的,即可以是ffff ,ds:(si)(bx) --->偏移溢出,这样会不会有不良结果?
2、即然si是任意的,整个ds段,内的偏移地址内容都可能被89行,改动,这样会不会影响到其它程序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-25 20:54:48 | 显示全部楼层
haiouda 发表于 2014-9-25 20:06
谢谢,热心回复,我看懂你,你说得很明白,谢谢。

这个是17.3课

1:假如si = FFFF ,这个时候如果在给si +1 的话 就会变成0 了,程序依然可以跑起来。
2 : 我觉得应该会影响其他程序,个人建议最好自己测试一下,一般如果自己能测试出来的,尽量自己测试,这样有利于你的学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-25 21:00:36 | 显示全部楼层
haiouda 发表于 2014-9-25 20:06
谢谢,热心回复,我看懂你,你说得很明白,谢谢。

这个是17.3课

我好像忘记一个重点了,就是si 没有赋初值的话,一般都是 0 ,你自己测试看看,debug一下程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

非常感谢:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表