- UID
- 70756
注册时间2010-11-1
阅读权限85
最后登录1970-1-1
见习版主
TA的每日心情 | 擦汗 2016-4-19 21:35 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
|
本帖最后由 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
|
|