首页 > 编程语言 >汇编_如何暂存数据

汇编_如何暂存数据

时间:2023-04-28 18:45:11浏览次数:43  
标签:汇编 LBB0 数据 mov rbp datasg cx bx 暂存

由双重循环引发的思考

内存中定义了二维字符串数组,使用双重循环完成字符遍历。
由于loop指令只认cx寄存器,在循环的过程中为了避免cx值被覆写,需要在内层循环前,将外层循环的cx值暂存起来。

使用寄存器完成大小写转换

assume cs:codesg,ds:datasg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
datasg ends
codesg segment
start: 

	mov ax,datasg
	mov ds,ax
	mov bx,0

	mov cx,3
	s0:
		mov dx,cx
		mov si,0
		mov cx,3
		s:
			mov al,[bx+si]
			and al,11011111b
			mov [bx+si],al
			inc si
			loop s
		add bx,16
		mov cx,dx
		loop s0
  	mov ax,4c00h
  	int 21h
codesg ends
end start					

在汇编程序中,用'...'方式指明的数据是以字符的形式给出,编译器将他们转换为ASCII码

程序这里,唯一需要关注的就是,这里使用了dx暂存外层循环cx计数器值。
延伸出来的问题就是,没有这么多寄存器可供使用,我们应该把数据暂存在内存中。

改用内存暂存

assume cs:codesg,ds:datasg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    dw 0
datasg ends
codesg segment
start: 

	mov ax,datasg
	mov ds,ax
	mov bx,0

	mov cx,3
	s0:
		mov ds:[30h],cx
		mov si,0
		mov cx,3
		s:
			mov al,[bx+si]
			and al,11011111b
			mov [bx+si],al
			inc si
			loop s
		add bx,16
		mov cx,ds:[30h]
		loop s0
  	mov ax,4c00h
  	int 21h
codesg ends
end start					


这段程序和之前不同的地方就是,使用内存暂存值,这样也有一个问题,就是变量多了,必须记住哪个数据放到了哪个内存单元。

使用栈

assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
datasg ends
stacksg segment
	dw 0
stacksg ends
codesg segment
start: 
	mov ax,stacksg
	mov ss,ax
	mov sp,2
	mov ax,datasg
	mov ds,ax
	mov bx,0

	mov cx,3
	s0:
		push cx
		mov si,0
		mov cx,3
		s:
			mov al,[bx+si]
			and al,11011111b
			mov [bx+si],al
			inc si
			loop s
		add bx,16
		pop cx
		loop s0
  	mov ax,4c00h
  	int 21h
codesg ends
end start


这里使用了栈,栈就很适合在当前循环场景下,这样即便有许多个循环或者变量,只要可以按顺序放入和取出,就可以放在栈里。
这要比单纯的放在某一个内存空间,自己记住数据对应的内存地址要好一点。

反汇编C语言双层循环代码

我们在高级语言里,循环这里一般都是任意定义i,j,k,实际反汇编看一下,这些局部变量被放到了哪里。
反汇编使用的是,在线编译,编译器使用的是x86-64 clang 16.0.0

int square() {
    int i;
    int j;
    for(i=0;i<1;i++) {
        for(j=0;j<1;j++) {
        }
    }
}
square:                                 # @square
        push    rbp
        mov     rbp, rsp
        mov     dword ptr [rbp - 8], 0
.LBB0_1:                                # =>This Loop Header: Depth=1
        cmp     dword ptr [rbp - 8], 1
        jge     .LBB0_8
        mov     dword ptr [rbp - 12], 0
.LBB0_3:                                #   Parent Loop BB0_1 Depth=1
        cmp     dword ptr [rbp - 12], 1
        jge     .LBB0_6
        jmp     .LBB0_5
.LBB0_5:                                #   in Loop: Header=BB0_3 Depth=2
        mov     eax, dword ptr [rbp - 12]
        add     eax, 1
        mov     dword ptr [rbp - 12], eax
        jmp     .LBB0_3
.LBB0_6:                                #   in Loop: Header=BB0_1 Depth=1
        jmp     .LBB0_7
.LBB0_7:                                #   in Loop: Header=BB0_1 Depth=1
        mov     eax, dword ptr [rbp - 8]
        add     eax, 1
        mov     dword ptr [rbp - 8], eax
        jmp     .LBB0_1
.LBB0_8:
        mov     eax, dword ptr [rbp - 4]
        pop     rbp
        ret

这里i,j是放在内存中的,也可以发现int是占用了4字节。

总结

今天收获有二。
其一,字符转换大小写之前都是使用的先判断的'a','z'大小关系,然后再加减。这里学到二进制按位操作后,去看了java源码,发现源码里也是通过二进制位判断的,不由得感叹这帮写源码的家伙们,技术都在细节里。
其二,暂存数据如何放置。高级语言里可以任意定义i,j,k,之前从来没有想过这些变量在具体执行的时候,变量放在哪里的问题。

标签:汇编,LBB0,数据,mov,rbp,datasg,cx,bx,暂存
From: https://www.cnblogs.com/snowsteps/p/17362500.html

相关文章

  • python用支持向量机回归(SVR)模型分析用电量预测电力消费|附代码数据
    全文链接:http://tecdat.cn/?p=23921最近我们被客户要求撰写关于SVR的研究报告,包括一些图形和统计输出。本文描述了训练支持向量回归模型的过程,该模型用于预测基于几个天气变量、一天中的某个小时、以及这一天是周末/假日/在家工作日还是普通工作日的用电量关于支持向量机的快速......
  • 开心档之MySQL 创建数据库
    MySQL数据类型MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。数值类型MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似......
  • GridView中CheckBox的数据绑定显示选中和未选中问题
    https://www.cnblogs.com/zxd543/p/3121169.html效果如下(以会员价为例)会员价(MemberPrice)字段的数据库类型为int(1表示true,0表示false)页面绑定如下:<asp:TemplateFieldHeaderText="会员价"><ItemStyleHorizontalAlign="Center"Width="60px"/>......
  • pop 出栈,sorted临时排序,容器类型的数据,zip函数
    divmod(a,b)返回一对商和余数,结果和(a//b,a%b)一致 字典是Python中唯一的映射类型。 Python的源文件以"py"为扩展名,有python.exe解释运行,可在控制台下运行。"pyw"是图形开发用户接口(GUI)文件的扩展名,作为桌面应用程序,这种文件用于开发图形界面的,由pythonw.exe解释......
  • 开心档之MySQL 数据类型
    MySQL数据类型MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。数值类型MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以......
  • Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测|附代
    全文下载链接: http://tecdat.cn/?p=27042最近我们被客户要求撰写关于新冠疫情的研究报告,包括一些图形和统计输出。在本文中,该数据根据世界各国提供的新病例数据提供。获取时间序列数据df=pd.read_csv("C://global.csv")探索数据此表中的数据以累积的形式呈现,为了找出每天......
  • 做BI财务数据分析,国产BI软件经验更足
    不管是为了提高销售额,还是为了提高库存周转、疏通现金流,都离不开数据分析,特别是BI大数据分析可视化。因此这几年来BI软件在各行各业的接受度迅速提升,特别是在财务数据分析方面,国产BI软件更是经验、技术到位。要说做中国企业的BI财务数据分析,国产BI软件的经验比谁都足。1、国产BI软......
  • 开心档之MySQL 创建数据库
    MySQL创建数据库我们可以在登陆MySQL服务后,使用create命令创建数据库,语法如下:CREATEDATABASE数据库名;以下命令简单的演示了创建数据库的过程,数据名为RUNOOB:[root@host]#mysql-uroot-pEnterpassword:******#登录后进入终端mysql>createDATABASE......
  • Mysql数据库设计和事务
    一对一在任意一方建立外键,关联另一方主键一对多在多的一方建立外键关联另一方的主键多对多1.建立中间表2.中间表至少包含2个外键,分别关联双方主键内连接1.隐式连接select*fromemp,deptwhereemp.dep_id=dept.did   2.显式连接select*fromemp(inner)joindep......
  • python之cx_Oracle实现本地exe连接oracle数据库执行命令
    代码实现#-*-coding:GBK-*-importosimportcx_Oracle#导入cx_Oracle模块importtimedefgetData():conn=cx_Oracle.connect('username/password@ip:port/orcl')cur=conn.cursor()sql="SELECT*fromUSERwhereUSER_ID=\'......