曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 5.3 Debug跟踪loop循环

5.3 在Debug中跟踪用loop指令实现的循环程序

首先要考虑一下超出地址存储能力的问题:

加入我们要计算在FFFF:0006单元中的数乘以3,并将结果存储在DX中。

我们每次做这种类似的计算时,要注意是否会超出DX的存储范围!

ffff:0006单元中的数是字节型数据,所以范围在0~255之间,这是因为对于字节型数据,计算方式如下:

$$2^8=256$$

所以范围在0~255之间,相对的对于DX通用寄存器,由于数据存储针对的往往是字型数据,而针对于16位的字型数据,计算方式如下:

$$2^{16}=65536$$

所以数据长度在0~65535之间,所以在FFFF:0006中的8位字节型数据乘以3是不会超过DX寄存器的存储长度的。

但是要注意的是,每次执行类似loop循环指令时,都要考虑到数据存储是否会超过相应寄存器的存储长度。

循环累加来实现乘法,如何使用寄存器

将FFFF:0006单元中的数值赋值给AX,用DX进行累加。先设$(DX)=0$,再做3次$(DX)=(DX)+(AX)$运算。

如何保证字节单元和寄存器字型数据的长度统一并赋值?

设FFFF:6单元中的数据时XXH,若要AX中的值和FFFF:0006单元中的相等,AX中的数据应为00XXH。所以,若实现FFFF:0006单元向AX赋值,应该令$(AH)=0$,$(AL)=(FFFF6H)$。

书中给出代码:

assume cs:code
code segment
    mov ax, 0ffffh ;注意这里
    mov ds, ax
    mov bx, 6
    
    mov al, [bx]
    mov ah, 0   ;这行以及下一行可以简写为
    mov dx, 0   ;mov ax, [bx]
    
    mov cx, 3
s:  add dx, ax
    loop s
    
    mov ax, 4c00h
    int 21h

code ends
end

注意代码第三行,汇编源程序中,不能以字母开头,所以必须加0!!

关于多次循环的debug跟踪

之前涉及到的代码都是循环次数较少的跟踪过程,那么假如循环次数很多,又该如何解决呢?

这里有两个方案:

第一个方案是遇到循环指令时后,直接输入-p命令,自动重复执行,直到$(CX)=0$为止。

第二个方案是在遇到,如loop 0012时,直接用,如g 0016直接执CS:0016处,进而跳过循环。

Last One

使用Python 读写Excel (1)

整理自小甲鱼鱼C论坛 openpyxl 模块简单易用、功能广泛,单元格格式、图片、表格、公式、筛选、批注、文件保护等功能都具有,图表功能是其一大特点。openpyxl模块的安装pip install openpyxl创建并保存Excel文件通过调用openpyxl.Workbook()生成一个Workbook的实例化对象,这个就代表一个工作簿:import openpyxlwb = openpyxl.Workbook()# 获取活跃的工作表ws = wb.active# 数据可以直接赋值给...…

pythonMore
Next One

汇编语言 5.2 loop

Loop 指令loop 指令的格式是:loop 标号, CPU执行loop指令的时候,要进行两步操作: $(CX) = (CX) - 1$ 判断CX的值,不为零则转至标号处执行程序,如果为零则继续向下执行 CX的值影响着loop指令的执行结果。通常,我们用loop指令来实现循环功能,CX中存放着循环的次数我们编写一个实现$2^12$的代码,代码如下:assume cs:codecode segmentstart: mov ax, 2 mov cx, 11 s: ad...…

汇编语言More