nasm : test jmp instruction_nasm jmp-程序员宅基地

技术标签: nasm  

前言

验证一下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 0x7c00

	cli ; ///< 关中断
	
	xor ax, ax
	mov ds, ax ; ///< 使si的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0
	mov es, ax ; ///< 使di的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0
	mov ss, ax ; ///< 使sp的默认段寄存器为实模式当前段, 和代码段寄存器cs一样, 都是0
	mov sp, 0x7c00
	
	sti ; ///< 开中断
	cld ; ///< 清方向标志, 使基于si,di的操作后, si++, di++
	
	mov cx, 2 ; ///< 执行2次
case_test_jmp:
	mov ax, 0
	
case_jmp_pt1:
	mov ax, 1
	jmp case_jmp_pt3 ; ///< 向下跳
	mov ax, 0xff
	
case_jmp_pt2:
	mov ax, 2
	jmp case_jmp_default ; ///< 向下跳
	mov ax, 0xff
	mov ax, 0xff

case_jmp_pt3:
	mov ax, 3
	jmp case_jmp_pt2 ; ///< 向上跳
	mov ax, 0xff
	mov ax, 0xff
	mov ax, 0xff

case_jmp_default:
	mov ax, 10
	mov ax, 0xff
	jmp case_jmp_pt1 ; ///< 向上跳

	loop case_test_jmp
	
str_prog_end:
	db "MBR execute END", 0x0d, 0x0a, 0
	
	; /// 显示字符串
fn_disp_str:
	pusha
	
fn_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, al
	jz fn_disp_str_end ; ///< 字符串是以0结尾的
	
	mov ah, 0x0e
	
	; /// 颜色值定义参考 http://blog.csdn.net/lostspeed/article/details/48469103
	mov bx, 7 ; ///< 显示页为0, 前景色为白色
	int 0x10
	
	jmp fn_disp_str_disp_one_char_from_si
	
fn_disp_str_end:
	popa
	ret

jmp $

用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> s
Next at t=156816104
(0) [0x000000007c07] 0000:7c07 (unk. ctxt): mov ss, ax                ; 8ed0
<bochs:7> u 0x7c00 0x7c40
00007c00: (                    ): cli                       ; fa
00007c01: (                    ): xor ax, ax                ; 31c0
00007c03: (                    ): mov ds, ax                ; 8ed8
00007c05: (                    ): mov es, ax                ; 8ec0
00007c07: (                    ): mov ss, ax                ; 8ed0
00007c09: (                    ): mov sp, 0x7c00            ; bc007c
00007c0c: (                    ): sti                       ; fb
00007c0d: (                    ): cld                       ; fc
00007c0e: (                    ): mov cx, 0x0002            ; b90200
00007c11: (                    ): mov ax, 0x0000            ; b80000
00007c14: (                    ): mov ax, 0x0001            ; b80100
00007c17: (                    ): jmp .+14                  ; eb0e
00007c19: (                    ): mov ax, 0x00ff            ; b8ff00
00007c1c: (                    ): mov ax, 0x0002            ; b80200
00007c1f: (                    ): jmp .+20                  ; eb14
00007c21: (                    ): mov ax, 0x00ff            ; b8ff00
00007c24: (                    ): mov ax, 0x00ff            ; b8ff00
00007c27: (                    ): mov ax, 0x0003            ; b80300
00007c2a: (                    ): jmp .-16                  ; ebf0
00007c2c: (                    ): mov ax, 0x00ff            ; b8ff00
00007c2f: (                    ): mov ax, 0x00ff            ; b8ff00
00007c32: (                    ): mov ax, 0x00ff            ; b8ff00
00007c35: (                    ): mov ax, 0x000a            ; b80a00
00007c38: (                    ): mov ax, 0x00ff            ; b8ff00
00007c3b: (                    ): jmp .-41                  ; ebd7
00007c3d: (                    ): loop .-46                 ; e2d2
00007c3f: (                    ): dec bp                    ; 4d
<bochs:8> u
00007c07: (                    ): mov ss, ax                ; 8ed0
<bochs:9> s
Next 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

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LostSpeed/article/details/48827223

智能推荐

Spring Cloud(六)配置中心(Spring Cloud Config)_本地运行config-prod.properties-程序员宅基地

文章浏览阅读241次。一、简介在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config 。Spring Cloud Config就是我们通常意义上的配置中心。Spring Cloud Config-把应用原本放在本地文件的配置抽取出来放在中心服务器,本质是配置信息从本地迁移到云端。..._本地运行config-prod.properties

Linux常见基本指令合集及其效果展示_linux 展示-程序员宅基地

文章浏览阅读268次,点赞2次,收藏6次。首先先问大家一个问题:在磁盘上建一个空文件,这个文件会占据磁盘的储存空间吗?实践出真知,我们发现新建一个文本文档,它的大小是0kB,这时有小伙伴就会认为既然它的大小是0KB,那么它当然也就不会占用磁盘空间咯。然而真的是这样吗?我们打开这个文件的属性来一探究竟:我们发现系统不仅记录了这个空文件的大小,同时还有它的文件名、文件类型、所在位置、创建时间等信息,难道这些信息不要占用系统空间吗,当然要!一个空文件同样会占用系统空间文件 = 文件内容 + 属性路径的本质就是这颗多叉树的搜索路径。_linux 展示

iTOP-3588开发板快速启动手册Windows安装串口终端调试串口常见问题(二)_windows 调试串口-程序员宅基地

文章浏览阅读140次,点赞10次,收藏3次。问题二:非旺玖原装PL2303,请联系供货商或PL2303TA不支持WINDOWS11及后续版本问题。进设备管理器,找到端口COM,有问题会提示“非旺玖原装的PL2303,请联系您的供货商”。更多内容可以B站搜索迅为RK3588开发板;2.4.2 驱动问题。_windows 调试串口

python怎么输出_Python如何输出整数-程序员宅基地

文章浏览阅读7.7k次。Python输出整数的方法:先使用str()函数将数字转换成字符串赋值给变量i,再用“if i.count('.') == 0”语句判断字符串中是否没有小数点,如果是则输出这个字符串,这样输出的数字就都是整数了示例代码如下:x = [23.5, 45.6, 987, 698, 123, 654]for i in x:i = str(i)if i.count('.') == 0:print(I)执行..._python的print整数

js中好用的方法(复制剪贴板、时间转换、大数字单位转换)_js 粘贴板时间-程序员宅基地

文章浏览阅读146次。js中好用的工具方法复制内容到手机剪贴板:/** * 拷贝数据到剪贴板 */ public static CopyToClipBoard(str){ let copyDom = document.createElement("input"); // 获得需要复制的内容 copyDom.setAttribute("value",str); //不需要让他displaynone // copyDom._js 粘贴板时间

FTP上传下载工具类_vsftp下载工具类-程序员宅基地

文章浏览阅读419次。记录一篇将图片等静态资源上传至vsftpd服务器的工具类package com.zhouym.baiwei.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.i..._vsftp下载工具类

随便推点

EDM邮件群发的关键要素?如何高效地发信?-程序员宅基地

文章浏览阅读267次,点赞6次,收藏4次。EDM邮件群发虽然看似简单,但其中蕴含的要素却十分丰富。AokSend,依托强大API/SMTP接口,实现EDM邮件高效群发。精准触达,一键发送,让您的营销信息迅速覆盖目标客户,提升品牌影响力!

对话框未进入PreTranslateMessage函数-程序员宅基地

文章浏览阅读235次。定义了两个对话框CDlgParent和CDlgChild,CDlgChild已设置Child属性,CDlgParent未重定义PreTranslateMessage函数,在CDlgChild的PreTranslateMessage函数中设断点,未运用原因: 对话框均在动态库中定义,且为使用共享MFC DLL的规则DLL,此方式无法响应PreTranslateMessage消息,但应用程序可不使..._mfc pretranslatemessage 不进入

UI自动化测试之5大常见问题(建议收藏)(1),2024年最新从青铜到王者的路线-程序员宅基地

文章浏览阅读722次,点赞10次,收藏19次。1)UFT即原来的QTP与ST合并而来,由HP公司开发,是一个企业级的商业自动化测试工具,提供了强大易用的录制回放功能,同时兼容对象识别模式与图像识别模式,支持B/S和C/S两种架构的软件测试;一款基于python语言编写的自动化测试框架工具,具备良好的扩展性,支持关键字驱动,支持多种类型的客户端和接口,可进行分布式测试;3)Selenium自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

Linux创建操作网桥的两种命令及持久化_bridge命令-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏48次。1.基础介绍1.1 简述1.2 网桥配置命令及安装(CentOS系统)2. brctl和bridge命令建桥2.1 brctl命令说明及范式2.2 brctl场景使用2.3 bridge命令及范式3.ip命令建桥3.1 ip命令建桥说明4.桥的持久化1.基础介绍1.1 简述什么是网桥  网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。它是Linux上用来做TCP/IP二层协议交._bridge命令

css3大全-程序员宅基地

文章浏览阅读153次。孔子曰:学而不思则罔,思而不学则殆。废话不多说,直接上。浅谈兼容css相较于js html来说,兼容性问题最不是事,CSS在最初设计时,就有一个协议:如果不能识别选择器属性,那么就默认不处理,不报错。这个也是CSS得以发展的非常重要的特征。下面是各个浏览器私有前缀:IE -ms-Chrome -webkit-Firefox -moz-Safari -webkit-..._css 文字后仰

Linux学习笔记 01 - Linux概况_linux 从哪个版本开始支持lvm-程序员宅基地

文章浏览阅读760次。一、操作系统的发展历程操作系统是用来=控制和管理系统资源、方便用户使用计算机的程序的集合,是人机交互的接口。大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。1. 服务器专用的 UNIX 操作系统UNIX 操作系统与1969年由美国贝尔实验室肯·汤普森(K.Thompson)和丹尼斯·麦卡利斯泰尔·里奇(D.M.Ritchie)开发完成,是真正意义上的多用户多任务操作系统。UNIX的商业版版本主要包括SUN公司(现被Oracle公司收购)的Solaris、IBM_linux 从哪个版本开始支持lvm