鱼C论坛

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

ds ?????

 关闭 [复制链接]
发表于 2014-9-25 11:53:32 | 显示全部楼层 |阅读模式
2鱼币
  1. ;最基本的字符串输入程序,需要具备下面的功能:
  2. ;(1) 在输入的同时需要显示这个字符串;
  3. ;(2)一般在输入回车符后,字符串输入结束;
  4. ;(3)能够删除已经输入的字符。

  5. ;编写一个接收字符串的输入子程序,实现上面三个基本功能。
  6. ;因为在输入的过程中需要显示,子程序的参数如下:
  7. ;        (dh)、(dl)=字符串在屏幕上显示的行、列位置;
  8. ;        ds:si 指向字符串的存储空间,字符串以O 为结尾符。


  9. assume cs:code

  10. code segment
  11. start:       
  12.         call getstr       

  13. return:       
  14.         mov ax,4c00h
  15.         int 21h

  16. ;完整的接收字符串输入的子程序

  17. getstr:       
  18.         push ax

  19. getstrs:
  20.         mov ah,0
  21.         int 16h
  22.        
  23.         cmp al,20h
  24.         jb nochar                   ;判断的是ASCII码小于0,说明不是字符
  25.         mov ah,0;
  26.         call charstack                ;字符入栈
  27.         mov ah,2
  28.         call charstack                ;显示栈中的字符
  29.         jmp getstrs


  30. nochar:       
  31.         cmp ah,0eh                        ;退格键的扫描码
  32.         je backspace
  33.         cmp ah,1ch                        ;回车键的扫描码
  34.         je enter
  35.         jmp getstrs
  36.        
  37.        
  38. backspace:                                ;退格
  39.         mov ah,1       
  40.         call charstack                ;字符出栈
  41.         mov ah,2
  42.         call charstack                ;显示栈中的字符
  43.         jmp getstrs

  44. enter:                                        ;回车
  45.         mov al,0
  46.         mov ah,0
  47.         call charstack                 ;0入栈
  48.         mov ah,2
  49.         call charstack                ;显示栈中的字符

  50.         pop ax
  51.         ret ;getstr ends


  52. ;功能子程序实现

  53. charstack:
  54.         jmp short charstart
  55.        
  56.         table dw charpush,charpop,charshow
  57.         top dw 0                           ;栈顶
  58.        
  59. charstart:
  60.         push bx
  61.         push dx
  62.         push di
  63.         push es

  64.         cmp ah,2
  65.         ja sret
  66.         mov bl,ah
  67.         mov bh,0
  68.         add bx,bx
  69.         jmp word ptr table[bx]

  70. charpush:
  71.         mov bx,top
  72.         mov [si][bx],al
  73.         inc top
  74.         jmp sret

  75. charpop:
  76.         cmp top,0
  77.         je sret
  78.         dec top
  79.         mov bx,top
  80.         mov al,[si][bx]       
  81.         jmp sret

  82. charshow:
  83.         mov bx,0b800h
  84.         mov es,bx
  85.         mov al,160
  86.         mov ah,0       
  87.         mul dh
  88.         mov di,ax
  89.         add dl,dl
  90.         mov dh,0
  91.         add di,dx

  92.         mov bx,0

  93. charshows:
  94.         cmp bx,top
  95.         jne noempty
  96.         mov byte ptr es:[di],' '       
  97.         jmp sret

  98. noempty:
  99.         mov al,[si][bx]
  100.         mov es:[di],al
  101.         mov byte ptr es:[di+2],' '
  102.         inc bx
  103.         add di,2
  104.         jmp charshows

  105. sret:       
  106.         pop es
  107.         pop di
  108.         pop dx
  109.         pop bx
  110.         ret

  111. code ends

  112. 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-5-17 23:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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