wai1216 发表于 2016-5-25 17:59:05

第十五课

本帖最后由 wai1216 于 2016-5-25 22:42 编辑

虽然最近跟着破解班学习了一些基础的破解,但也还在看C的食品
今天看到十五课了。校长边讲,然后讲怎么实现,先开始是跟着写。之后暂停视频,自己想怎么写
----------------
1。实现加法
assume cs:code,ds:data
data segment

dw 20h dup(0)

data ends

code segment

c dw 0

func_add:
      mov ax,es:
      mov cx,es:
      add ax,cx
      mov es:,ax

      add bx,2
      jmp es:


start:
      mov ax,data
      mov es,ax
      xor bx,bx

      mov si,offset func_r
      mov es:,si
      add bx,2

      mov ax,10h
      mov es:,ax
      add bx,2
      mov ax,20h
      mov es:,ax
      add bx,2


      jmp func_add

func_r:
      mov ax,4c00h
      int 21h

code ends
end start
----------------
2。实现加法和减法
;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   22E7 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:
      mov cx,es:
      add ax,cx
      mov es:,ax

      add bx,2

;sub(a - 7,b + 2)      
      mov si,offset sub_r
      mov es:,si
;a-7
      add bx,2
      mov ax,es:
      sub ax,7
      mov es:,ax
;b+2
      add bx,2
      mov ax,es:
      add ax,2
      mov es:,ax

;int sub()
      add bx,2
      jmp func_sub

      
;sub_r/c += sub()
sub_r:
      mov ax,es:
      mov cx,es:
      add ax,cx
      
      mov es:,ax
      add bx,2


      sub bx,8
      jmp es:

;return      
      
func_sub:
;int sub()
      mov ax,es:
      mov cx,es:
      sub ax,cx
      mov es:,ax

      add bx,2
      jmp es:

main:
      mov ax,data
      mov es,ax
      xor bx,bx

;add(10,20)
      mov si,offset retn_main
      mov es:,si
      add bx,2
      mov ax,10h
      mov es:,ax
      add bx,2
      mov ax,20h
      mov es:,ax
      add bx,2

      jmp func_add


retn_main:
;return_main
      mov ax,4c00h
      int 21h

code ends
end main
第二个版本:
assume cs:code,ds:data
data segment

dw 20h dup(0)

data ends

code segment

c dw 0

func_add:
      mov ax,es:
      mov cx,es:
      add ax,cx
      mov es:,ax
    jmp func_sub

func_sub:   
    mov ax,es:
    sub ax,7
      mov cx,es:
    add cx,2

      sub ax,cx
    mov dx,es:
      add ax,bx
      mov es:,ax
    add bx,2
      jmp es:


      mov ax,es:
      mov cx,es:
      sub ax,cx

      mov es:,ax
      add bx,2
      jmp es:

main:
      mov ax,data
      mov es,ax
      xor bx,bx

      mov si,offset end_main
      mov es:,si
      add bx,2
      mov ax,10h
      mov es:,ax
      add bx,2
      mov ax,20h
      mov es:,ax
    add bx,2

      jmp func_add


end_main:
    mov ax,4c00h
    int 21h

code ends
end main
-----
最后按照自己对C的理解,返回一个地址
;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   22E7 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:
      mov cx,es:
      add ax,cx
    mov es:,ax

    add bx,2

;sub(a - 7,b + 2)      
    mov si,offset sub_r
    mov es:,si
;a-7
    add bx,2
    mov ax,es:
    sub ax,7
    mov es:,ax
;b+2
    add bx,2
    mov ax,es:
    add ax,2
    mov es:,ax

;int sub()
    add bx,2
    jmp func_sub

   
;sub_r/c += sub()
sub_r:
    mov ax,es:
    mov cx,es:
    add ax,cx
   
    mov es:,ax
    add bx,2


    sub bx,8
      jmp es:

;return   
   
func_sub:
;int sub()
    mov ax,es:
      mov cx,es:
      sub ax,cx
      mov es:,ax

    add bx,2
      jmp es:

main:
      mov ax,data
      mov es,ax
      xor bx,bx

;add(10,20)
      mov si,offset retn_main
      mov es:,si
      add bx,2
      mov ax,10h
      mov es:,ax
      add bx,2
      mov ax,20h
      mov es:,ax
    add bx,2

      jmp func_add


retn_main:
;return_main
    mov ax,4c00h
    int 21h

code ends
end main
---------------
使用push
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:
      mov cx,ss:
      add ax,cx
      mov ss:,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
页: [1]
查看完整版本: 第十五课