返回列表 发帖

在Amibios BB段为什么不能用call

如题,哪位DX解释一下,谢谢

[ 本帖最后由 simon 于 2009-3-26 10:19 编辑 ]

...不知道对不对
我的理解 : 函数之前的注释写了 no strack
而call需要把cs ip 写入stark 然后当调用完成后 用ret 返回之前保存的cs ip...

不过还是等大大们来清晰的解释

TOP

谢谢提醒。。。刚才看了下code,应该是stack的问题,在checkpoint d4的时候 Set stack,d5就可以用call了

[ 本帖最后由 simon 于 2009-3-26 10:32 编辑 ]

TOP

原帖由 bicennan 于 2009-3-26 11:54 发表
...不知道对不对
我的理解 : 函数之前的注释写了 no strack
而call需要把cs ip 写入stark 然后当调用完成后 用ret 返回之前保存的cs ip...

不过还是等大大们来清晰的解释

這樣理解沒錯,就是因為內存未初始化好,沒有堆棧段
世界上分爲10种人,懂二進制和不懂二進制的

TOP

恩,没错,memory没有初始化,stack没有,自然不能call,只能jmp来jmp去。。

D4和D5中间会run MRC做memory的初始化

TOP

LoL ..果然都是大大..
解释的都很彻底..有福 学习了..

TOP

用ret_sp jmp_di或者宏来替代。

不过,如果CAR Enable的话,在BB也可以用Call

TOP

wj0225..大大
能详解下么?
ret_sp  jmp_di...这2个指令 一般的汇编参考书上没看到..是宏么?但是在ami code中没看到..
...
还有 CAR 是什么?

TOP

..e. 看了下 好像是个宏 ..但是没找到ami 这个宏写到哪里了..调用的方法确实是和call一般

TOP

原帖由 bicennan 于 2009-3-26 20:13 发表
wj0225..大大
能详解下么?
ret_sp  jmp_di...这2个指令 一般的汇编参考书上没看到..是宏么?但是在ami code中没看到..
...
还有 CAR 是什么?


晕,你要是AMI code的话,在bootblock的code部分一定有这几个宏,其实利用jmp指令返回而已。

CAR, cache as ram,不过AMI的code中CAR是给AMIDebugger用的吧,正常的code不会跑CAR的。

TOP

thanks.10#

TOP

ret_sp        macro        dummy                       
        local        llll, lll               
        even
        mov        sp, offset cs:lll       
        jmp        dummy
lll:
        dw        offset cs:llll                ; return address
llll:
endm


;                JMP_SI

jmp_si        macro        dummy                       
        local        llll                       
        mov        si, offset cs:llll        ; return address
        jmp        dummy
llll:
endm


原来是这样。看懂了 jmp_si 申明了一个||||   然后 类似于一个push ||||,之后的ret_sp相当于返回了cs:||||

TOP

有945的代码么?它的MRC就是最好的学习资料了。

TOP

建议去看看Award code里的BB段,写的非常清楚易懂。
五色令人目盲;五音令人耳聋;五味令人口爽

TOP

AMI core 已经很清楚了~
看看ami core 就好了~
以后估计也是用ami core来工作

award 看的少,个人觉得比较乱~
新人估计设置编译环境都比较麻烦~

以前做bios的时候,看“高手”在command 下,
操作比较酷~呵呵  

BB 不能call ,这是个架构的问题,更bios 无关~
现在,efi 比较早就打开car 了~

如果看core8 的agasa 的code ,里面也有car 的动作~

ami core 有一个不是很妥的地方
就是bb 也用run_cseg ,这样好多新人与f000的run_cseg 搞混
比方说phoenix 就是加了一个bbrun_cseg
不是很记得具体写,意思是这样的~

至于宏,可以理解成,数学中整体代换,c++ 中的inline
c中#define

[ 本帖最后由 ali 于 2009-3-27 11:21 编辑 ]

TOP

ret_sp        macro        dummy                        
        local        llll, lll               
        even
        mov        sp, offset cs:lll        
        jmp        dummy
lll:
        dw        offset cs:llll                ; return address
llll:
endm

关于ret_sp这个宏我有一点没有搞明白
假设lll的地址为200h,那么mov        sp, offset cs:lll这条语句就是把200h赋给了SP,而jmp        dummy中的dummy函数最后的ret语句相当于直接把sp pop给了IP,也就是说dummy执行完以后,IP直接回到了lll处,那么还要llll这个标号干什么呢?
为什么不能直接写成:
ret_sp        macro        dummy                        
        local        lll               
        even
        mov        sp, offset cs:lll        
        jmp        dummy
lll:
endm

请知道的指点一下,谢谢!

TOP

本帖最后由 xtdumpling 于 2009-9-17 11:04 编辑

不懂,写代码实验了一下,debug32反汇编看就明白了. LZ改了之后,SP里面是下一部分指令,而不是下一条指令的地址!
  1. .model tiny;原来的
  2. .code
  3. ret_sp        macro        dummy; call routine without stack
  4.         local        llll, lll                ; local label
  5.         even
  6.         mov        sp, offset cs:lll        ; return address
  7.         jmp        dummy
  8. lll:
  9.         dw        offset cs:llll                ; return address
  10. llll:
  11. endm
  12.         org 100h

  13. .startup
  14.         ret_sp dummy_proc
  15.         int 3
  16. .exit
  17.         test_msg db 'This is test string!',0dh,0ah,'$'

  18. dummy_proc proc near
  19.         lea dx,test_msg
  20.         mov ah,09h
  21.         int 21h
  22.         ret
  23. dummy_proc endp
  24. end

  25. 2907:0100 BC0501           MOV     SP,0105h
  26. 2907:0103 EB1E             JMP     Short 0123
  27. 2907:0105 0107             DW      0107
  28. 2907:0107 CC               INT     3
  29. 2907:0108 B44C             MOV     AH,4Ch
  30. 2907:010A CD21             INT     21h

  31. 2907:0123 8D160C01         LEA     DX,[010C]
  32. 2907:0127 B409             MOV     AH,09h
  33. 2907:0129 CD21             INT     21h
  34. 2907:012B C3               RET    ;sp=0105h [sp]=0107h
复制代码

  1. .model tiny;按LZ说法修改后的:
  2. .code
  3. ret_sp        macro        dummy; call routine without stack
  4. ;        local        llll, lll                ; local label
  5.         local        lll                ; local label
  6.         even
  7.         mov        sp, offset cs:lll        ; return address
  8.         jmp        dummy
  9. lll:
  10. ;        dw        offset cs:llll                ; return address
  11. ;llll:
  12. endm
  13.         org 100h

  14. .startup
  15.         ret_sp dummy_proc
  16.         int 3
  17. .exit
  18.         test_msg db 'This is test string!',0dh,0ah,'$'

  19. dummy_proc proc near
  20.   
  21.         lea dx,test_msg
  22.         mov ah,09h
  23.         int 21h
  24.         ret
  25. dummy_proc endp
  26. end

  27. 2907:0100 BC0501           MOV     SP,0105h
  28. 2907:0103 EB1C             JMP     Short 0121

  29. 2907:0105 CC               INT     3
  30. 2907:0106 B44C             MOV     AH,4Ch
  31. 2907:0108 CD21             INT     21h

  32. 2907:0123 8D160C01         LEA     DX,[010C]
  33. 2907:0127 B409             MOV     AH,09h
  34. 2907:0129 CD21             INT     21h
  35. 2907:012B C3                RET   ;sp=0105h,[sp]=B4CCh CD4Ch -->

  36. 2907:0105 CC               INT     3
  37. 2907:0106 B44C             MOV     AH,4Ch
  38. 2907:0108 CD21             INT     21h
  39. 2907:010A 54               PUSH    SP
复制代码
studying

TOP

OK,我知道了,谢谢xtdumpling

TOP

17# xtdumpling
thanks!
不知道为什么我每次反汇编出来的都是这个样子:
C:\DOCUME~1\YUNAXI~1\Desktop\MASM615>debug test1.exe
-u
0B56:0100 BC0501        MOV     SP,0105
0B56:0103 EB1E          JMP     0123
0B56:0105 07            POP     ES
0B56:0106 01CC          ADD     SP,CX
0B56:0108 B44C          MOV     AH,4C
0B56:010A CD21          INT     21
0B56:010C 54            PUSH    SP
0B56:010D 68            DB      68
0B56:010E 69            DB      69
0B56:010F 7320          JNB     0131
0B56:0111 69            DB      69
0B56:0112 7320          JNB     0134
0B56:0114 7465          JZ      017B
0B56:0116 7374          JNB     018C
0B56:0118 207374        AND     [BP+DI+74],DH
0B56:011B 7269          JB      0186
0B56:011D 6E            DB      6E
0B56:011E 67            DB      67
0B56:011F 210D          AND     [DI],CX
-q

TOP

1.因为代码段有定义数据,所以要自己修改一下.或者单步跑一遍就出来了.
2.建议使用debug32反汇编.
studying

TOP

返回列表
GForce-200 PLC-GIPENG.COM