nasm : test jmp instruction
来源:互联网 发布:一拳超人King知乎 编辑:程序博客网 时间:2024/06/13 03:08
前言
验证一下nasm编译后的JMP指令的跳转地址计算.
测试用例: 不同的跳转偏移, 不同的跳转方向
测试程序
; /// @file boot_dispmsg/test_op_code_jmp.asm; /// @brief 测试jmp命令的向上跳和向下跳的的目标地址计算; /// @note 编译命令行 ; /// cd D:\prj\nasm_prj\boot\boot_dispmsg; /// d:; /// C:\nasm\nasm.exe test_op_code_jmp.asm -o test_op_code_jmp.bin -l test_op_code_jmp.list; /// @note 将 test_op_code_jmp.bin 写到U盘0扇区bits 16 ; ///< 16位汇编org 0x7c00cli ; ///< 关中断xor ax, axmov ds, ax ; ///< 使si的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0mov es, ax ; ///< 使di的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0mov ss, ax ; ///< 使sp的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0mov sp, 0x7c00sti ; ///< 开中断cld ; ///< 清方向标志, 使基于si,di的操作后, si++, di++mov cx, 2 ; ///< 执行2次case_test_jmp:mov ax, 0case_jmp_pt1:mov ax, 1jmp case_jmp_pt3 ; ///< 向下跳mov ax, 0xffcase_jmp_pt2:mov ax, 2jmp case_jmp_default ; ///< 向下跳mov ax, 0xffmov ax, 0xffcase_jmp_pt3:mov ax, 3jmp case_jmp_pt2 ; ///< 向上跳mov ax, 0xffmov ax, 0xffmov ax, 0xffcase_jmp_default:mov ax, 10mov ax, 0xffjmp case_jmp_pt1 ; ///< 向上跳loop case_test_jmpstr_prog_end:db "MBR execute END", 0x0d, 0x0a, 0; /// 显示字符串fn_disp_str:pushafn_disp_str_disp_one_char_from_si:; int 0x10, ah = 0x0e; - VIDEO - 写字符并移动光标 (TTY WRITE); AL = character, BH = display page (alpha modes); BL = foreground color (graphics modes)lodsb ; ///< load byte to al from si, then si++and al, aljz fn_disp_str_end ; ///< 字符串是以0结尾的mov ah, 0x0e; /// 颜色值定义参考 http://blog.csdn.net/lostspeed/article/details/48469103mov bx, 7 ; ///< 显示页为0, 前景色为白色int 0x10jmp fn_disp_str_disp_one_char_from_sifn_disp_str_end:poparetjmp $
用bochs验证
Next at t=0(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0<bochs:1> pb 0x7c00<bochs:2> c(0) Breakpoint 1, 0x0000000000007c00 in ?? ()...<bochs:6> sNext at t=156816104(0) [0x000000007c07] 0000:7c07 (unk. ctxt): mov ss, ax ; 8ed0<bochs:7> u 0x7c00 0x7c4000007c00: ( ): cli ; fa00007c01: ( ): xor ax, ax ; 31c000007c03: ( ): mov ds, ax ; 8ed800007c05: ( ): mov es, ax ; 8ec000007c07: ( ): mov ss, ax ; 8ed000007c09: ( ): mov sp, 0x7c00 ; bc007c00007c0c: ( ): sti ; fb00007c0d: ( ): cld ; fc00007c0e: ( ): mov cx, 0x0002 ; b9020000007c11: ( ): mov ax, 0x0000 ; b8000000007c14: ( ): mov ax, 0x0001 ; b8010000007c17: ( ): jmp .+14 ; eb0e00007c19: ( ): mov ax, 0x00ff ; b8ff0000007c1c: ( ): mov ax, 0x0002 ; b8020000007c1f: ( ): jmp .+20 ; eb1400007c21: ( ): mov ax, 0x00ff ; b8ff0000007c24: ( ): mov ax, 0x00ff ; b8ff0000007c27: ( ): mov ax, 0x0003 ; b8030000007c2a: ( ): jmp .-16 ; ebf000007c2c: ( ): mov ax, 0x00ff ; b8ff0000007c2f: ( ): mov ax, 0x00ff ; b8ff0000007c32: ( ): mov ax, 0x00ff ; b8ff0000007c35: ( ): mov ax, 0x000a ; b80a0000007c38: ( ): mov ax, 0x00ff ; b8ff0000007c3b: ( ): jmp .-41 ; ebd700007c3d: ( ): loop .-46 ; e2d200007c3f: ( ): dec bp ; 4d<bochs:8> u00007c07: ( ): mov ss, ax ; 8ed0<bochs:9> sNext at t=156816105(0) [0x000000007c09] 0000:7c09 (unk. ctxt): mov sp, 0x7c00 ; bc007c.../// @note 指令字节数和JMP相对偏移值,都是用十进制表示的, 指令地址是用16进制表示的(0) [0x000000007c17] 0000:7c17 (unk. ctxt): jmp .+14 (0x00007c27) ; eb0e ; ///< 0x7c17 + 2(本指令[eb0e]字节数为2) + 14 = 0x7c27...(0) [0x000000007c2a] 0000:7c2a (unk. ctxt): jmp .-16 (0x00007c1c) ; ebf0 ; ///< 0x7c2a + 2(本指令[ebf0]字节数为2) - 16 = 0x7c1c...(0) [0x000000007c1f] 0000:7c1f (unk. ctxt): jmp .+20 (0x00007c35) ; eb14 ; ///< 0x7c1f + 2(本指令[eb14]字节数为2) + 20 = 0x7c35...(0) [0x000000007c3b] 0000:7c3b (unk. ctxt): jmp .-41 (0x00007c14) ; ebd7 ; ///< 0x7c3b + 2(本指令[ebd7]字节数为2) - 41 = 0x7c14...<bochs:27> q
0 0
- nasm : test jmp instruction
- nasm : test instruction - test
- nasm : test eflags ZF
- nasm : test bit
- usage of test instruction(option "-n")
- Nasm
- NASM
- NASM
- nasm
- SpinLock原理和实现(SpinLock:test and set value in one instruction)
- A Test in MASM and GCC 64-bits for instruction mov and lea
- Jmp Use
- JMP因子分析
- jmp指令
- JMP指令
- JMP - 跳转
- JMP - 跳转
- jmp instructions
- RTMP 4 Android
- React Native课程-入门
- test
- redis安装、配置、命令
- OC-1-对象的存储细节、#progma mark指令、NSString类
- nasm : test jmp instruction
- cocoapods安装及使用详解
- CocoaPods使用教程
- eclipse编写C/C++语言
- React Native 教程-基础教程
- 爱上linux(3)-僵尸进程
- Hadoop之HA验证
- 多线程的深入理解
- MVC5:使用Ajax和HTML5实现文件上传功能