看图你就会明白。实际上标号X1的首地址为ASCII码C的字单元地址,X2的首地址开始于 DB 16 dup () 语句,紧接着X1的终止地址,那么它的首地址相对于X1偏移4 - 1个字节单元;X2的终止地址相对于其首地址偏移16 - 1个字节单元,相对于X1偏移18个字节单元。那么$ - X1实际上是当前地址与X1首地址之差。由此可以得出,mov BX, Y指令执行后,BX的值为18d,也就是12h。
| …… |
| 43h | ASCII: C 4 byte X1
| 00h |
| 44h | ASCII: D
| 00h |
| | 16 byte X2
……
| | <--- $
| …… |
(当前地址$与X1首地址之差为18个字节偏移,等同于X1与X2占有的字节单元,不包括X1的首地址和X2的终止地址)
关于伪指令$,它表示地址计数器的当前值,也就是本条指令第一个字节的地址偏移,如:
ORG $ + 8 表示起始地址定位于当前编译地址第一字节的后8个字节处;JMP $ 表示无条件转移至当前地址,其实际执行效果为永远停留在当前地址。
又如:Array DW 1, 2, $ + 4, 3, 4, $ + 4,可以用图表示为:
| …… |
| 01h | <--- Array 1
| 00h |
| 02h | 2
| 00h |
| 08h | $ + 4 ($相对于Array首地址的偏移是4,因此$ + 4 = 8h)
| 00h |
| 03h | 3
| 00h |
| 04h | 4
| 00h |
| 0eh | $ + 4 ($相对于Array首地址的偏移是10,因此$ + 4 = 0eh)
| 00h |
| … … |
可见,$用在不同的地方,其表示的当前地址计数是不同的。
表示原地空转,一般与跳转指令相连用 如51 I汇编中,ajmp $表示程序就停在当前位置,相当于\x0d\L1: AJMP L1 \x0d\\x0d\举例应用:\x0d\如果一个程序只在中断跑,主程序没有东西可执行的东东,而这时主程序又不能停,此时就用 ajmp $,那么此时主程序就在该处原地不动,单步调试时可以看到就在原地走。这是只要中断条件到就执行中断。
“$”是汇编语言中的一个预定义符号,等价于当前正汇编到的段的当前偏移值。例如eg:指令“jmp $+3”中的“$”表示当前这条指令在代码段中的偏移量。
汇编语言, 即第二代计算机语言,用一些容易理解和记忆的字母,单词来代替一个特定的指令,比如:用“ADD”代表数字逻辑上的加减,“ MOV”代表数据传递等等,通过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能。
扩展资料:
语言特点
汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯-语言。但是由于编写和调试汇编语言程序要比高级语言复杂,因此目前其应用不如高级语言广泛。
汇编语言比机器语言的可读性要好,但跟高级语言比较而言,可读性还是较差。不过采用它编写的程序具有存储空间占用少、执行速度快的特点,这些是高级语言所无法取代的。在实际应用中,是否使用汇编语言,取决于具体应用要求、软件开发时间和质量等方面作权衡。
汇编器
典型的现代汇编器(assembler)建造目标代码,由解译组语指令集的易记码(mnemonics)到操作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体。
使用符号参考是汇编器的一个重要特征,它可以节省修改程序后人工转址的乏味耗时计算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码
- $ (汇编语言中字符串结束的标志)
有符号的数第一个位是符号位,0代表正数,1代表负数,其余位用补码表示,可以表示正负数。无符号的数第一个位不是符号位,也就是说只能表示正数
比如说随便举个简单的例子:10101010,如果是有符号数,那么换算成十进制就是-86,如果是无符号数,那么换算成十进制就是170
十六进制一般跟着个H,八进制则跟着个O,十六进制有0-9,A-F,八进制只有0-7
XXH和XXXXH有区别,一个是16位,一个是32位
简单来说,就是把最高位扩展到要求的位数
比如85h(-123)是8位的(最高位为1),如果要求扩展到16位,就是0ff85h(-123)
比如7bh(123)是8位的(最高位为0),如果要求扩展到16位,就是007bh(123)
欢迎分享,转载请注明来源:表白网
评论列表(0条)