avatar
阳生。
风毛丛劲节,只上尽头竿。

汇编语言学习日志

DEBUG模式下几种基本命令

t 追踪执行命令
a 指定内存后(回车)写入指令
d 从哪段内存开始 显示多长的内存//显示内存中内容
e 从哪段内存开始(回车)修改内存
u 从哪段内存开始//显示翻译后内存中内容

mov ax,bx
add ax,bx
sub ax,bx

注意高八位、低八位,h、l
注意数据溢出,加法溢出则舍去,减法不足则借位,指定了高八位、低八位就以对应的两个数字为参考标准确定是否要舍去与借位,不能修改其它数字。

常见的运算符

mul

mul bx

相乘的数都是八位或者都是十六位
八位:一个默认放在AL中,另一个放在8位reg或内存中;结果默认放在AX中
十六位:一个默认放在AX中,另一个放在16位reg或内存中;结果默认低16位放在AX中,高16位放在DX中。

8位:ALBL = AX
16位:AX
BX = DXAX

div

div bx

除数:8位、16位(2个数字、4个数字)两种
被除数:默认放在AX或DX和AX中,除数为8位则被除数为16位默认放在AX中;如果除数为16位,则被除数为32位,默认放在DX和AX中,DX存放高16位,AX存放低16位。
结果:如果除数为8位,则AL中存放结果,AH储存余数;如果除数为16位,则AX存储商,DX存储余数。

除数8位:AX/BL = AL … AH
除数16位:DXAX/BX = AX … DX

and、or

以二进制为标准
指定8位还是16位进行运算

shl

shl ax,1

shl、shr 左移、右移,超出的舍去,缺少的0补
rol、ror 循环左移、右移,超出的补到后面缺少的
带进位的循环左移、右移 rcl rcr(了解)
以二进制为标准

inc、dec

inc ax

dec ax

相当于ax++、ax–
(进位、借位与普通加减法相同)

其它杂项

如果除法除以0会进入一个中断
使用int 0也可以进入这个中断
如果除以0是一个错误,会触发int 0的中断,会找到一个地址,代码运行的指针会指向这个地址,接下来或许可以通过在这个地址准备相应的处理方法来解决异常(了解)

我们需要知道的就是当代码发生错误,代码运行的指针会跳转到其它地址。

常见的中断编号int 0、int 9

ds寄存器与地址

物理地址 = 段地址*16+偏移地址

DS寄存器,数据段地址寄存器
r ds
可编辑DS当中的内容

配合mov指令使用,如

mov ax,[60]

效果会是将DS中的段地址结合[60]偏移地址指向的内容复制给ax
[]中对应的都是低位

但是注意:在内存当中字单元的概念,即将一个字型数据(16位)的内存单元,由两个地址连续的内存单元,高地址内存单元(非起始)存放字符型高位字节,低地址内存单元(起始)存放字符型低位字节。
如我们将DS设置为21F0后,使用mov指令会将21F0:0060中的内容复制给ax
而d 21F0:0060这样显示:
12 34
则0060为低位,0061为高位
所以对应AXL 和 AXH,由此得到ax为3412
但是以上内容在使用al、ah等直接对八位操作的时候,对应的物理地址上的八位数会直接被移动到对应位置,而不需要考虑是高地址还是低地址内存

另外

注意:不能使用mov ds,10 00
但是可以
mov 1000,ax
mov ds,ax

Site by 阳生 | Powered by Hexo | theme PreciousJoy