鱼C论坛

 找回密码
 立即注册
查看: 3155|回复: 1

[学习笔记] 《王爽汇编》第十章实验10-3

[复制链接]
发表于 2018-5-22 14:41:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
虽然看起来简单,但真做起来还是有不少问题的。
比如出栈入栈的计数一开始就没有想到。
比如要注意子程序之间寄存器值的相互干扰。。
比如要写好注释,之前写的代码因为没有注释,已经不知道是干什么的了。。

这次用了不少时间,但也算理解的更透彻了一些。

  1. ;名称:dtoc
  2. ;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符号。
  3. ;参数:(ax)=word型数据
  4. ;          ds:si指向字符串的首地址
  5. ;返回:无
  6. ;
  7. ;思路:取一个16进制数,连续除以10,余数的倒序就是10进制数。
  8. ;          每个余数+30H就是对应ascii码。


  9. assume cs:code

  10. data segment
  11.         dw 123,12666,1,8,38
  12. data ends

  13. code segment
  14. start:        mov ax,12666
  15.                   mov bx,data
  16.                   mov ds,bx
  17.                   mov si,0                ;设置ds:si
  18.        
  19.                   call dtoc                ;进制转换

  20.                 mov dh,8
  21.                 mov dl,3
  22.                 mov cl,2
  23.                 call show_str        ;显存写入

  24.                 mov ax,4c00h
  25.                 int 21h

  26. dtoc:
  27.         push cx
  28.         push si
  29.         push dx

  30.         mov si,0                ;余数计数
  31.         mov bx,10                ;除数
  32. dtoc_s0:
  33.         mov dx,0
  34.         div bx
  35.         mov cx,ax
  36.         add dx,30h
  37.         jcxz dtoc_ok
  38.         push dx
  39.         inc si
  40.         jmp dtoc_s0
  41.        
  42. dtoc_ok:
  43.         push dx
  44.         inc si

  45.         mov cx,si
  46.         mov si,0
  47. dtoc_ok_s1:                        ;出栈
  48.         pop ax
  49.         mov [si],al
  50.         inc si
  51.         loop dtoc_ok_s1

  52.         pop dx
  53.         pop si
  54.         pop cx
  55.         ret       

  56. show_str:                        ;显示字符的子程序
  57.                 push ax
  58.                 push bx
  59.                 push cx
  60.                 push dx
  61.                 push si

  62.                 ;计算行号
  63.                 dec dh
  64.                 mov ax,0a0h
  65.                 mul dh
  66.                 mov bx,ax

  67.                 ;计算列号
  68.                 mov ax,2
  69.                 mul dl
  70.                 sub ax,2

  71.                 ;行号+列号
  72.                 add ax,bx

  73.                 ;计算显存首地址
  74.                 mov bx,8000H
  75.                 add ax,bx
  76.                 mov di,ax
  77.                 mov ax,0b000H
  78.                 mov es,ax        ;es:di

  79.                 ;写入数据
  80.                 mov bl,cl
  81.                 mov ch,0
  82. show_str_s0:

  83.                 mov al,[si]
  84.                 mov es:[di],al
  85.                 mov es:[di+1],bl

  86.                 mov cl,[si]
  87.                 jcxz show_str_s1

  88.                 inc si
  89.                 add di,2
  90.                 jmp short show_str_s0

  91. show_str_s1:
  92.                 pop si
  93.                 pop dx
  94.                 pop cx
  95.                 pop bx
  96.                 pop ax
  97.                 ret
  98. code ends
  99. end start
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
虫虫-中中(无忧) + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-8 00:21:49 | 显示全部楼层
感谢朋友  你解决了我遇到的一个重大问题:

子程序show_str 与子程序 dtoc分别独立编写的时候  标号我都以随性的命名方法 想到什么就写成什么

结果俩个子程序放到一块的时候  有部分标号重复 造成编译错误

看到你的以子程序名为前缀,给子程序标号进行命名的方法,我恍然大悟,终于知道该怎么解决标号冲突的问题了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 15:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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