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