鱼C论坛

 找回密码
 立即注册
查看: 2771|回复: 2

[技术交流] 以堆、栈的方式实现:程序设计1 <第三版>

[复制链接]
发表于 2017-12-23 11:31:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 PAGE-404 于 2017-12-23 11:31 编辑

EMU8086

EMU8086

逆向过VC++6.0程序的老铁,一定有种熟悉的感觉吧~~~
推荐一个汇编IDE:http://www.emu8086.com/files/emu8086v408r11.zip

  1. data segment
  2.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  3.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  4.     db '1993','1994','1995'
  5.     ;以上是表示21年的21个字符串
  6.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  8.     ;以上是表示21年公司总收的21个dword型数据
  9.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  10.     dw 11542,14430,45257,17800
  11.     ; 以上是表示 21年公司雇员人数的21个word型数据
  12. data ends


  13. stack segment
  14.     dw 100h dup (20h)
  15. stack ends

  16. heap segment
  17.     db 32 dup (20h)
  18. heap ends   

  19. code segment
  20.     assume cs:code,ds:data,ss:stack,es:heap
  21.     start:
  22.         ; 初始化寄存器
  23.         mov ax,data
  24.         mov ds,ax
  25.         mov ax,stack
  26.         mov ss,ax
  27.         mov ax,heap
  28.         mov es,ax
  29.         ; 进入主函数
  30.         call main
  31.         ; 结束标志
  32.         mov ax,4Ch
  33.         int 21h
  34.         
  35.     ; -----------------------------------------------------------
  36.     ; 功能:入口函数
  37.     ; 参数:
  38.     ;       无
  39.     ; 返回:
  40.     ;       无
  41.     ; -----------------------------------------------------------   
  42.     main:
  43.         ; 保存bp
  44.         push bp
  45.         ; 提升栈底
  46.         mov bp,sp
  47.         ; 提升栈顶,即16个byte
  48.         sub sp,10h
  49.         ; 保存cx
  50.         push cx
  51.         ; PeopleCountToHeap中bx (人数偏移地址)
  52.         ; 我也想push 0A80h,但是进栈就变成了FFA8,操蛋~~~
  53.         mov cx,0A8h
  54.         push cx
  55.         ; IncomeToHeap中bx (收入偏移地址)
  56.         mov ss:[bp-2],54h
  57.         push ss:[bp-2]
  58.         ; ShowString中bx (累加)
  59.         mov ss:[bp-4],0
  60.         push ss:[bp-4]
  61.         ; Year中bx (累加)
  62.         push ss:[bp-4]
  63.         ; 栈中存入ds和es
  64.         push ds
  65.         push es
  66.         ; 一共有21条数据,开始循环
  67.         mov cx,21
  68.         first:
  69.             ; 调用YearToHeap函数,将年份保存在heap
  70.             call YearToHeap
  71.             ; 调用IncomeToHeap函数,将收入保存在heap
  72.             call IncomeToHeap
  73.             ; 调用PeopleCountToHeap,将员工人数保存在heap
  74.             call PeopleCountToHeap
  75.             ; 调用AvgIncomeToHeap,计算人均收入,保存在heap
  76.             call AvgIncomeToHeap
  77.             ; 参数一:控制打印列
  78.             push ss:[bp-4]
  79.             ; 参数二:屏幕显示基址
  80.             mov ss:[bp-6],0B800h
  81.             push ss:[bp-6]
  82.             ; 参数三:控制打印颜色
  83.             mov ss:[bp-8],02h
  84.             push ss:[bp-8]
  85.             ; 调用ShowString,打印整条数据
  86.             call ShowString
  87.             ; 因为传了三个参数,平衡栈
  88.             add sp,6
  89.             ; 累加(1.人数偏移地址 2.收入偏移地址)
  90.             add ss:[bp-14h],2
  91.             add ss:[bp-16h],4
  92.             ; 清除heap中的数据
  93.             call clearHeap
  94.         loop first
  95.         ; 恢复各个寄存器的值
  96.         pop es
  97.         pop ds
  98.         ; 中间push了3个所以sp加6
  99.         add sp,6
  100.         pop cx
  101.         ; 恢复原来栈顶,栈底
  102.         mov sp,bp
  103.         pop bp
  104.         ret
复制代码

游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-23 14:19:07 | 显示全部楼层
不错,就是看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-23 19:29:36 | 显示全部楼层
新手小白,艰辛观看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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