关于汇编的一点东西

发布时间 2023-10-19 12:59:16作者: 泥薯

1,低位高位相加产生进位时互不影响,该舍掉还是舍掉。

2, 100和10(十进制)都是小于255(FF),就是说使用8位二进制,2位16进制就可以表示了,AX,BX等等那些位上的都是16进制。在汇编里mul乘法不是 mul ax,bx这种,由于越界问题,所以8*8情况下,al里保存1个8位数,另一个存在bl里,然后mul bl,系统就会把bl*al的结果放在ax里。然后8*16的情况按照16*16去做就ok,同理,ax里放一个16位数,然后bx里放一个16位数,mul bx,系统会把ax*bx的结果的高位存在(前四位算高16位,后四位算低16位,对于乘出的16进制结果而言)DX里,低位存在AX里。 另外这种方法是不会溢出的因为对于8*8,最大是FF*FF,得到FE01,可以放下,FFFF*FFFF得到FFFE 0001,也可以放下。

2, 对于div除法的话,如果是16位除8位的话,16位放在AX里,8位放在bl,div bl即可,得到的商在al,余数在ah。如果是32位除16位的话,32位高4位(指4个16进制位)放在dx,低4位放在ax,16位放在bx,得到的商放在AX,余数放在DX。
注意 bl或者bx,这些换成cl,cx,d什么的可以,但是div,mul bl...是默认ax/bl,所以被除数存在ax里是不会变的。

2, 关于二进制的and or运算,前者同为1才得1,后者只要有1就为1,

3,shl shift left左移,shr 同理为右移, nop指令没有什么用会占空间,然后inc和dec指令分别为++和--,xchg指令作用为交换,neg的作用就是把那个数对应 的二进制取反+1. 1字是2字节16位。

3, 如果div 除了0,那么就会引发int 0 这个中断,会使cs,ip改变,就会使指向代码的指针指向这个段地址+偏移地址指向的地方,也就是指向 BIOS ROM 中断例程的入口点。这样处理器就能够进入指定的异常处理代码来处理除法错误。应该是对的。。。。。 int 21是一个常用的中断指令。

4, 物理地址=段地址*16+偏移地址。对于16进制数而言*16就是左移1位。
所以1个物理地址可以不止1种表示。对于ds寄存器而言它是数据段寄存器。mov ds 0FF0这种都是不可以的,只能拿ax,bx啥的去mov。另外0000H,D,O,B后面跟的这四个代表了是16进制还是10进制还是8进制还是2进制的意思。
mov(等操作) ax(...) [数字] 就是对以ds为段地址,以数字为偏移地址的哪里的内存进行操作,由于大端序小端序的原因,如果想给al搞[50],ah搞[51],就不要直接ax的弄可能会反过来,最好指定al,ah分开弄即可。

5, 好神奇的汇编,首先-t执行的是cs ip指向的物理地址的机器码,也就是我当前输入的汇编指令所转换成机器能看懂的机器码,并且随着执行cs ip会接着变化,那么我之前执行过了很多汇编指令那么那些cs ip所对应的物理地址的哪一行机器码其实就是我们当初写的汇编指令了,如果我们-r 修改cs ip回到当初,执行-t的话应该是会继续输出的。另外比如2000:0000 对应的就是2000左移1为+0000,得到的20000的物理地址。 -u如果没有参数默认查看当前cs ip对应的物理地址的那些机器码并且翻译为对应汇编指令, -d就是可以看对应cs ip的那些机器码。

5, cs ip 表示了代码要执行的指针。不能直接mov ip 0000啥的格式问题吧就和 不能 mov ds 0000一样,jmp 1000:0000就是改掉cs和ip相当于跳转功能进而可以实现那个位置的代码,jmp k 就是把当前的ip改成k 。也是跳转。

7, bx有特殊的意义,它还可以做偏移地址。ax,cx不行,si,di也可以像bx一样做偏移地址[],并且可以[bx+1]啥的,但是不能[bx+ax]这种。[bx+si+data],[bx+di+data]可以但是不能[bx+si+di+data]这种,并且可以实现mov [],cx 这种赋给内存。
总之就是只有4个寄存器可以进行内存单元的寻址 bx,si,di,bp.
利用bx可以进行的寻址,bp也可以。它们唯一的区别就是[bx]表示以ds为段地址,bx为偏移地址, [bp]表示以ss为段地址,bp为偏移地址。没有[bp]就以默认ds为段地址。