PAGE-404 发表于 2017-12-23 11:31:37

以堆、栈的方式实现:程序设计1 <第三版>

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


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

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


stack segment
    dw 100h dup (20h)
stack ends

heap segment
    db 32 dup (20h)
heap ends   

code segment
    assume cs:code,ds:data,ss:stack,es:heap
    start:
      ; 初始化寄存器
      mov ax,data
      mov ds,ax
      mov ax,stack
      mov ss,ax
      mov ax,heap
      mov es,ax
      ; 进入主函数
      call main
      ; 结束标志
      mov ax,4Ch
      int 21h
      
    ; -----------------------------------------------------------
    ; 功能:入口函数
    ; 参数:
    ;       无
    ; 返回:
    ;       无
    ; -----------------------------------------------------------   
    main:
      ; 保存bp
      push bp
      ; 提升栈底
      mov bp,sp
      ; 提升栈顶,即16个byte
      sub sp,10h
      ; 保存cx
      push cx
      ; PeopleCountToHeap中bx (人数偏移地址)
      ; 我也想push 0A80h,但是进栈就变成了FFA8,操蛋~~~
      mov cx,0A8h
      push cx
      ; IncomeToHeap中bx (收入偏移地址)
      mov ss:,54h
      push ss:
      ; ShowString中bx (累加)
      mov ss:,0
      push ss:
      ; Year中bx (累加)
      push ss:
      ; 栈中存入ds和es
      push ds
      push es
      ; 一共有21条数据,开始循环
      mov cx,21
      first:
            ; 调用YearToHeap函数,将年份保存在heap
            call YearToHeap
            ; 调用IncomeToHeap函数,将收入保存在heap
            call IncomeToHeap
            ; 调用PeopleCountToHeap,将员工人数保存在heap
            call PeopleCountToHeap
            ; 调用AvgIncomeToHeap,计算人均收入,保存在heap
            call AvgIncomeToHeap
            ; 参数一:控制打印列
            push ss:
            ; 参数二:屏幕显示基址
            mov ss:,0B800h
            push ss:
            ; 参数三:控制打印颜色
            mov ss:,02h
            push ss:
            ; 调用ShowString,打印整条数据
            call ShowString
            ; 因为传了三个参数,平衡栈
            add sp,6
            ; 累加(1.人数偏移地址 2.收入偏移地址)
            add ss:,2
            add ss:,4
            ; 清除heap中的数据
            call clearHeap
      loop first
      ; 恢复各个寄存器的值
      pop es
      pop ds
      ; 中间push了3个所以sp加6
      add sp,6
      pop cx
      ; 恢复原来栈顶,栈底
      mov sp,bp
      pop bp
      ret

**** Hidden Message *****

fred_tan 发表于 2017-12-23 14:19:07

不错,就是看不懂

木兮梓涵 发表于 2023-2-23 19:29:36

新手小白,艰辛观看{:5_107:}

beikerray119 发表于 2024-4-21 11:52:41

楼主牛逼
页: [1]
查看完整版本: 以堆、栈的方式实现:程序设计1 <第三版>