飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2004|回复: 0

[C/C++] 第十五课

[复制链接]
  • TA的每日心情
    擦汗
    2016-4-19 21:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-5-25 17:59:05 | 显示全部楼层 |阅读模式
    本帖最后由 wai1216 于 2016-5-25 22:42 编辑

    虽然最近跟着破解班学习了一些基础的破解,但也还在看C的食品
    今天看到十五课了。校长边讲,然后讲怎么实现,先开始是跟着写。之后暂停视频,自己想怎么写
    ----------------
    1。实现加法
    [Asm] 纯文本查看 复制代码
    assume cs:code,ds:data
    data segment
    
    dw 20h dup(0)
    
    data ends
    
    code segment
    
    c dw 0
    
    func_add:
            mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            add ax,cx
            mov es:[bx],ax
    
            add bx,2
            jmp es:[bx-8]
    
    
    start:
            mov ax,data
            mov es,ax
            xor bx,bx
    
            mov si,offset func_r
            mov es:[bx],si
            add bx,2
    
            mov ax,10h
            mov es:[bx],ax
            add bx,2
            mov ax,20h
            mov es:[bx],ax
            add bx,2
    
    
            jmp func_add
    
    func_r:
            mov ax,4c00h
            int 21h
    
    code ends
    end start

    ----------------
    2。实现加法和减法
    [Asm] 纯文本查看 复制代码
    ;00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19.....
    ; add   10     20    30    sub()     9     22  E7 FF
    ;                 30+FFE7  
    assume cs:code,ds:data
    data segment
    
    dw 20h dup(0)
    
    data ends
    
    code segment
    
    c dw 0
    
    func_add:
    ;int add()
            mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            add ax,cx
            mov es:[bx],ax
    
            add bx,2
    
    ;sub(a - 7,b + 2)        
            mov si,offset sub_r
            mov es:[bx],si
    ;a-7
            add bx,2
            mov ax,es:[bx-8]
            sub ax,7
            mov es:[bx],ax
    ;b+2
            add bx,2
            mov ax,es:[bx-8]
            add ax,2
            mov es:[bx],ax
    
    ;int sub()
            add bx,2
            jmp func_sub
    
            
    ;sub_r/c += sub()
    sub_r:
            mov ax,es:[bx-2]
            mov cx,es:[bx-10]
            add ax,cx
            
            mov es:[bx-10],ax
            add bx,2
    
    
            sub bx,8
            jmp es:[bx-8]
    
    ;return        
            
    func_sub:
    ;int sub()
            mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            sub ax,cx
            mov es:[bx],ax
    
            add bx,2
            jmp es:[bx-8]
    
    main:
            mov ax,data
            mov es,ax
            xor bx,bx
    
    ;add(10,20)
            mov si,offset retn_main
            mov es:[bx],si
            add bx,2
            mov ax,10h
            mov es:[bx],ax
            add bx,2
            mov ax,20h
            mov es:[bx],ax
            add bx,2
    
            jmp func_add
    
    
    retn_main:
    ;return_main
            mov ax,4c00h
            int 21h
    
    code ends
    end main

    第二个版本:
    [Asm] 纯文本查看 复制代码
    assume cs:code,ds:data
    data segment
    
    dw 20h dup(0)
    
    data ends
    
    code segment
    
    c dw 0
    
    func_add:
            mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            add ax,cx
            mov es:[bx],ax
        jmp func_sub
    
    func_sub:    
        mov ax,es:[bx-4]
        sub ax,7
            mov cx,es:[bx-2]
        add cx,2
    
            sub ax,cx
        mov dx,es:[bx]
            add ax,bx
            mov es:[bx],ax
        add bx,2
            jmp es:[bx-8]
    
    
            mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            sub ax,cx
    
            mov es:[bx],ax
            add bx,2
            jmp es:[bx-8]
    
    main:
            mov ax,data
            mov es,ax
            xor bx,bx
    
            mov si,offset end_main
            mov es:[bx],si
            add bx,2
            mov ax,10h
            mov es:[bx],ax
            add bx,2
            mov ax,20h
            mov es:[bx],ax
        add bx,2
    
            jmp func_add
    
    
    end_main:
        mov ax,4c00h
        int 21h
    
    code ends
    end main

    -----
    最后按照自己对C的理解,返回一个地址
    [Asm] 纯文本查看 复制代码
    ;00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19.....
    ; add   10     20    30    sub()     9     22  E7 FF
    ;                 30+FFE7 
    assume cs:code,ds:data
    data segment
    
    dw 20h dup(0)
    
    data ends
    
    code segment
    
    c dw 0
    
    func_add:
    ;int add()
            mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            add ax,cx
        mov es:[bx],ax
    
        add bx,2
    
    ;sub(a - 7,b + 2)       
        mov si,offset sub_r
        mov es:[bx],si
    ;a-7
        add bx,2
        mov ax,es:[bx-8]
        sub ax,7
        mov es:[bx],ax
    ;b+2
        add bx,2
        mov ax,es:[bx-8]
        add ax,2
        mov es:[bx],ax
    
    ;int sub()
        add bx,2
        jmp func_sub
    
       
    ;sub_r/c += sub()
    sub_r:
        mov ax,es:[bx-2]
        mov cx,es:[bx-10]
        add ax,cx
       
        mov es:[bx-10],ax
        add bx,2
    
    
        sub bx,8
            jmp es:[bx-8]
    
    ;return   
       
    func_sub:
    ;int sub()
        mov ax,es:[bx-4]
            mov cx,es:[bx-2]
            sub ax,cx
            mov es:[bx],ax
    
        add bx,2
            jmp es:[bx-8]
    
    main:
            mov ax,data
            mov es,ax
            xor bx,bx
    
    ;add(10,20)
            mov si,offset retn_main
            mov es:[bx],si
            add bx,2
            mov ax,10h
            mov es:[bx],ax
            add bx,2
            mov ax,20h
            mov es:[bx],ax
        add bx,2
    
            jmp func_add
    
    
    retn_main:
    ;return_main
        mov ax,4c00h
        int 21h
    
    code ends
    end main

    ---------------
    使用push
    [Asm] 纯文本查看 复制代码
    assume cs:code,ds:data
    data segment
    
    dw 20h dup(0)
    
    data ends
    
    code segment
    
    c dw 0
    
    func_add:
            mov bp,sp
            mov ax,ss:[bp+2]
            mov cx,ss:[bp+4]
            add ax,cx
            mov ss:[bp-2],ax
            retn
    
    main:
            mov ax,data
            mov ss,ax
            mov sp,100h
    
            mov dx,20
            push dx
            mov dx,10
            push dx
            call func_add
            add sp,4
    
    next:
    	mov ax,4c00h
    	int 21h
    
    code ends
    end main

    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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