随笔分类 - 底层研究
摘要:博主学习的第一个编程语言是C语言(跟谭教授学的),其实,第一接触是basic,因为博主第一个接触的系统是DOS。Dos中自带一个qbasic编译器,所以就看资料写了一个hello,word!。但很快放弃了,因为qbasic不能编译成可执行程序,需要在编程环境中才能执行,感觉不够高大上。后打听到c语言
阅读全文
摘要:Offset伪指令我一直都认为只是获取标识符在段中的偏移地址,但经研究,发现了部分违反直觉的细微区别: 1、在完整端声明(Full segment definition)的模式下 如果offset mygroup:myvar或offset mysegment:myvar,可通过端前缀来获取myvar
阅读全文
摘要:当程序需要引用尚未定义的变量或标号时,编译器会如何处理呢,这就涉及到向前引用(Forward Reference)的概念。 一、Forward Reference的概念 程序引用到之前尚未定义的变量(Variable)、标号(Label)、段(Segment)或其他标识符(Symbol),编译器会如
阅读全文
摘要:Masm5以后推出的simplified segment模式及.model标准模型中,都将段组合成一个group,group的作用及优点是什么呢? 一、Group的作用 将组(group)后的所有段加入一个组,位于这些段内的的label(标号)或variables(变量)的偏移地址都参照Group的
阅读全文
摘要:Bochs是通过配置文件(.bxrc文件)的方式来设置模拟计算机的硬件参数,其中MEMORY部分,分别需要设置Guest和Host的大小来决定虚拟计算机的内存大小,有什么区别呢?通过下面的Bochs构架图可以弄清楚: 要点说明: 1、Bochs在现实环境中属于应用程序,Host表示应用程序用来模拟内
阅读全文
摘要:在MASM 5(Microsoft Micro Assembler)的汇编体系中,子程序(Procedures)的定义和调用是非常重要的,就像C、pascal等的函数和方法一样;且对深入理解高级语言里函数的底层原理极其重要,如函数的参数传递、栈、变长参数等。但在网络上许多教程及代码都极其不规范且语焉
阅读全文
摘要:学习MASM汇编时有时会被各种语法弄混,其实很多指令的规则是很简单的,但编译器为了方便添加了伪指令来帮助编译器更准确的生成机器代码。为了深入理解伪指令背后的逻辑,特将8086的编码规则记录如下,以便随时参阅。 一、编码规范: 二、编码约定:
阅读全文
摘要:MASM中如果将程序直接跳转到指定地址执行,如1234:5678,如果直接这样jmp 1234:5678或jmp [1234]:[5678]都无法通过编译,在debug中jmp 1234:5678倒是可以。那么如何能到达这个目的呢? 一、普通方法: 1、通过将地址保存到变量,然后far jmp: j
阅读全文
摘要:8086和186都是运行在实模式(real mode)下,从286开始支持保护模式(protected mode)。 下面是8086和186的完整指令集,参考《Microsoft Macro Assembler Reference Manual》,方便查阅。 一、操作符(Oprand)中缩写的含义:
阅读全文
摘要:在学习16位MASM汇编中,label并不陌生,在代码中通过名称+冒号(:)的形式定义label非常常见。但label伪指令却不常见,但有时确实很重要。它相当于把所在位置后的代码或数据看成label定义的新的数据类型或新的label(冒号形式)。听着有点抽象,实例如下: 一、代码标号(code la
阅读全文
摘要:在学习16位MASM汇编时,生成一个com格式的可执行文件,需要在代码的第一行写上org 0100h,各处的资料解释不尽相同,如: 1、程序从0100h处开始执行; 2、告诉编译器讲程序加载到0100h; 3、代码的偏移地址整体向后移动0100h,或段内的代码或数据从0100h开始放置。 这些解释在
阅读全文
摘要:在学习16位MASM宏汇编时,开始犯的一个错误就是认为assume就是给CS、SS、DS等段寄存器进行初始化赋值的。但又需要在源码的开始阶段,通过mov ax,datasg和mov ds,ax对DS进行手动赋值,assume ds:datasg不是已经赋值过了么,倍感疑惑! 比如下面代码: assu
阅读全文
摘要:在学习16位汇编时,debug是常用的调试工具,但很多基本用法,帮助中并未提及。本文中的基本概念是指命令语法中需要提供给命令的参数,在命令帮助中并未提供任何提示。经查资料和试验,特记录如下: 一、基本概念: DOS5.0之前debug是com格式,从5.0之后就改为exe格式了,本文是指的是DOS6
阅读全文
摘要:为了学习16位汇编,DOS6.22下的MASM5编译环境却没有特别好的编写工具。Vim for dos虽然已经很不错了,但习惯了图形界面的编程环境,只能显示25行文字的文本模式,实在是效率太低了(博主的水平也有很大原因)。因此,想通过映射共享文件夹的方式,可在Windows下用VSCode编写程序,
阅读全文
摘要:一、8080-80286内部寄存器基本没有变化: 二、从80386开始寄存器变为32位,增加保护模式: 三、标志寄存器:
阅读全文
摘要:16位的MASM汇编中,标识符(Specifiers)的作用很广。什么是标识符,就是需要我们自己命名的标识,如变量名、段名等。标识符的核心作用就是用容易记忆或书写的名称,代表一个不容易记忆或书写的数据和代码。就想用汇编指令代表机器代码一样,本质无区别。 一、标识符的主要应用到以下方面: 1、代表地址
阅读全文
摘要:Masm定义了一些符号及变量,用了表示一些常用的值或地址,常用的有: 一、$,表示当前行地址: 比如:可以用来计算字符串的长度,$-StringVar。 二、?、表示没有初始化值: 比如:db 1024 dup (?) 三、@@、@F和@B、表示相邻的标号: 比如:jmp @F表示跳转到下一个@@标
阅读全文
摘要:实模式(real mode)下采用段地址:偏移地址的方式进行定位。在Masm中,有2种方式对段地址进行初始化,一就是编译阶段,再就是程序执行阶段。 一、汇编阶段(Masm编译阶段): 汇编阶段通过Assume伪指令对段段寄存器的值进行指定(但并不对段寄存器真的赋值),而是按Assume指定的情况进行
阅读全文
摘要:初学王爽的《汇编语言》时,MASM 5的环境配置并未提及。相关软件可以在https://winworldpc.com/下载并安装(虚拟机我使用得是VMWare),其他网站下载的不是不全就是有问题,不如自己从零开始安装和配置。经查看相关资料后,用VMWare安装MS Dos6.22,并在WinWorl
阅读全文
摘要:从Microsoft的MASM汇编开始学习的汇编,MASM命令的详细用法少有书籍介绍,博主从《Microsoft Micro Assembler User's Guide》中学习后记录如下: 一、MASM 5.0的基本语法是 MASM [options] sourceName,[objectName
阅读全文