鱼C论坛

 找回密码
 立即注册
查看: 1824|回复: 0

[汇编作业] 实验十 3.数值显示

[复制链接]
发表于 2018-7-10 16:08:30 | 显示全部楼层 |阅读模式

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

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

x
分析:
其实就是16进制转为10进制,然后在打印。
按下键盘接收一个字符,进行编码,然后存储在内存。(字符编码后存储,用什么编码方法?ascii),用调速器debug查看都是二进制转为16进制的显示结果,要打印成10进制需要咱们自己转换

123d 十进制对应16进制 7BH
7bH   / 10d = 商ch 余 3
ch     / 10d =  商1  余 2
1      / 10d =  商0   余 1
结果就是321,倒序过来就是123,
  1. assume cs:code,ds:data,ss:stack

  2. stack segment
  3.         db 64 dup (0)
  4. stack ends

  5. data segment
  6.         dw 123,1222,0,88,388,36,3434
  7. data ends

  8. data1 segment
  9.         db 10 dup (0)                                ;转换后保存的的结果
  10. data1 ends

  11. code segment
  12. start:
  13.         mov ax,stack
  14.         mov ss,ax
  15.         mov sp,64
  16.        
  17.         push bp
  18.         mov bp,sp
  19.        
  20.         sub sp,6                                        ;第一个函数参数 function(data1,index,data)
  21.         mov ax,data                                        ;ds,index,es
  22.         mov [bp-2],ax
  23.         mov word ptr[bp-4],0
  24.         mov ax,data1
  25.         mov [bp-6],ax
  26.        
  27.        
  28.         sub sp,6                                        ;第二个函数参数        function(cx,行列,0b800h)
  29.         mov dh,10                                        ;行
  30.         mov dl,10                                        ;列
  31.         mov cl,01000010b                        ;颜色
  32.         mov [bp-6-2],0b800h                        ;es 0b800h
  33.         mov [bp-6-4],dx                                ;行列
  34.         mov [bp-6-6],cx                                ;颜色
  35.         mov cx,8
  36. lo:
  37.         push cx
  38.         call calc                                        ;转换字符,保存到data1
  39.         pop cx
  40.         add word ptr[bp-4],2                ;偏移下一个字
  41.        
  42.         push cx
  43.         call show_string                        ;打印字符串
  44.         pop cx
  45.         mov ah,[bp-9]                                ;打印字符串,下一行
  46.         add ah,1
  47.         mov [bp-9],ah

  48.         loop lo
  49.        
  50.         add sp,12                                        ;还原sp
  51.         pop bp
  52.         mov ax,4c00h
  53.         int 21h
  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;程序结束
  55. calc:                                                        ;转换字符
  56.         push bp
  57.         mov bp,sp
  58.         mov ax,[bp+6+6]                                ;读取参数
  59.         mov es,ax
  60.         mov ax,[bp+8+6]                                ;读取参数
  61.         mov si,ax
  62.         mov ax,[bp+0ah+6]                        ;读取参数
  63.         mov ds,ax
  64.        
  65.         push di                                                ;局部变量中需要用到的变量
  66.         sub di,di
  67.         sub dx,dx                                       
  68.         mov ax,ds:[si]
  69.         mov bx,10
  70. lo1:
  71.         div bx
  72.         add dl,30H
  73.        
  74.         push dx
  75.         ;mov byte ptr es:[di],dl        ;保存结果
  76.         inc di                                                ;次数累计器
  77.         mov cx,ax
  78.         sub dx,dx
  79.         jcxz over_2
  80.         jmp lo1
  81. over_2:
  82.         mov cx,di
  83.         sub di,di
  84. lo2:
  85.         pop dx                                                ;处理倒序字符
  86.         mov byte ptr es:[di],dl                ;保存结果
  87.         inc di
  88.         loop lo2
  89.        
  90.         mov byte ptr es:[di],0
  91.         pop di
  92.         pop bp
  93.         ret
  94.        
  95. show_string:
  96.         push bp                                                ;备份环境
  97.         mov bp,sp
  98.        
  99.         mov dx,[bp+6]                                ;颜色
  100.         mov ax,[bp+8]                                ;行号        行号需要计算所以保存在ax
  101.         mov bx,[bp+10]
  102.         mov es,bx                                        ;显示段地址
  103.         mov bx,[bp+12]
  104.         mov ds,bx                                        ;打印的字符串首地址
  105.        
  106.         sub bx,bx
  107.         mov bl,al                                        ;偏移在多少列?
  108.         add bl,bl                                        ;一个160个字节 1个字符需要占用2个字节
  109.         mov di,bx
  110.        
  111.         mov al,ah                                        ;偏移在多少行?
  112.         mov bx,160
  113.         mul bl
  114.         add di,ax

  115.         mov ax,dx                                        ;备份颜色
  116.         sub cx,cx
  117.         sub si,si
  118. show_string1:
  119.         mov bl,ds:[si]                                ;读取值
  120.         mov es:[di],bl                                ;字符
  121.         mov byte ptr es:[di].1,al        ;颜色
  122.        
  123.         mov cl,bl
  124.         add di,2
  125.         inc si
  126.         jcxz show_string_over
  127.         jmp show_string1
  128. show_string_over:
  129.         pop bp                                                ;恢复在函数使用的环境
  130.         ret                                                 ;返回函数,4表示在调用函数时传入的参数sp+4
  131. code ends
  132. end start
复制代码

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 11:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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