首页 > 编程语言 >汇编_寻址方式在结构化数据访问中的应用

汇编_寻址方式在结构化数据访问中的应用

时间:2023-05-04 20:46:35浏览次数:45  
标签:汇编 结构化 di mov si 寻址 寄存器 ax bx

如何寻址数据

巩固一下寄存器

  • reg: ax, bx, cx, dx, ap, bp, si, di
  • sreg: ds, ss, cs, es

bx, si, di, bp

  • 在8086CPU中,只有这4个寄存器可以用在"[...]"中进行内存单元的寻址。
  • 这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
  • 只要在[...]中使用寄存器bp,段地址默认是ss。

汇编语言中数据位置的表达

  1. 立即数
    对于直接包含在机器指令中的数据,在汇编指令中直接给出。例如,mov ax,1.
  2. 寄存器
    指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如,mov ax,bx.
  3. 段地址(SA)和偏移地址(EA)
    指令要处理的数据在内存中,在汇编指令中可用[X]的格式给出EA,SA在某个段寄存器中。例如:mov ax,[0]

寻址方式

当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。

指令要处理的数据有多长

  1. 通过寄存器指明,ax字操作,al字节操作
  2. X ptr 指明内存单元的长度,X可以为word或byte,mov word ptr [bx],1
  3. 其他方法,例如:push只进行字操作

实验七

由于题目给出了数据的存储方式,难度大大降低,只需考虑如何取数即可。
数据是结构化存储的,所以我们可以通过循环来索引数据。
偏移量需要自己计算,遇到不同长度的数据,还需要额外定义一个寄存器(di)来辅助运算。

assume cs:codesg
data segment
    db '1975','1976','1977'             ; 年份 4 * 3 = 12
    dd 16,22,382			; 收入 4 * 3 = 12
    dw 3,7,9 				; 人数 2 * 3 = 6data ends
table segment
    db 3 dup ('year summ ne ?? ') ; 16字节,4+1+4+1+2+1+2+1
table ends
codesg segment
; 一种方法是,四个属性,写四个循环,连续索引赋值,+4/+2
; 另一种方法是,四个属性,一个循环,根据偏移量索引
; 这里使用第二种方式,计算第一年的年份,然后+12,计算这一年的收入
start: 
	mov ax,data
	mov ds,ax
	mov ax,table
	mov es,ax
	mov bx,0
	mov si,0
	mov dx,0
	mov di,0 	;用来索引人数数据
	mov cx,3
	s0:
		mov ax,[bx]		
		mov es:[si],ax
		mov ax, [bx].2
		mov es:[si].2,ax

		mov ax,[bx].12	
		mov es:[si].5,ax
		mov ax, [bx].14
		mov es:[si].7,ax
		
		mov ax,[di].24	
		mov es:[si].10,ax

		mov ax,[bx].12
		mov dx,[bx].14
		div word ptr [di].24
		mov es:[si].13,ax

		add bx,4
		add di,2
		add si,16
		loop s0
  	mov ax,4c00h
  	int 21h
codesg ends
end start

总结

这节摘录了很多原书中的内容,大部分都是概念性的知识,记忆即可。实验七的意义,不仅仅在于如何计算结果写到另一块内存中,而是面对一个实际问题,我们要使用什么样的数据结构去存储、表达和运算。程序等于数据结构加算法,我想道理就在于此。

标签:汇编,结构化,di,mov,si,寻址,寄存器,ax,bx
From: https://www.cnblogs.com/snowsteps/p/17372400.html

相关文章

  • 汇编语言
    汇编语言debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。R命令查看、改变CPU寄存器的内容D命令查看内存中的内容E命令改写内存中的内容U命令将内存中的机器指令翻译成汇编指令T命令执行一条机器指令A命令以汇编指令的格式在内存中写入一条机器指......
  • Go 汇编详解
    Go汇编详解https://mp.weixin.qq.com/s?__biz=MzI1MzYzMjE0MQ==&mid=2247502457&idx=1&sn=9b754e6b17ade0d48694d089b6537092&chksm=e9d3019bdea4888df6dbde663632d06d7a695b563669ba4a94b1eca78d8ecb2c041af9023959&scene=132#wechat_redirect翻译搜索复制......
  • 转载:ARM 内联汇编语法
    https://blog.csdn.net/myprogram_player/article/details/121372941ARM内联汇编语法:asmasm-qualifiers(AsemblemTemplate:OutputOperands[:InputOperands[:Clobbers]]) (1)asm​这块直接写做__asm__​表示这是一段内联汇编。(2)asm-qualifiers​这里取值......
  • 汇编_如何暂存数据
    由双重循环引发的思考内存中定义了二维字符串数组,使用双重循环完成字符遍历。由于loop指令只认cx寄存器,在循环的过程中为了避免cx值被覆写,需要在内层循环前,将外层循环的cx值暂存起来。使用寄存器完成大小写转换assumecs:codesg,ds:datasgdatasgsegmentdb'ibm......
  • 【汇编学习】指令对标志寄存器的影响总结
    转载自百度网盘指令类型助记符(带*为特权指令)对标志寄存器的影响备注说明举例ZFCFPFSFOFAFDFIFTF数据传送类数据传送MOV不影响标志位 MoveMOVr/m32,imm32MOV* Moveto/fromControlReg......
  • 结构化状态的原则
    结构化状态的原则当您编写一个保存某些状态的组件时,您必须选择使用多少个状态变量以及它们的数据应该是什么形状。虽然即使使用次优状态结构也可以编写正确的程序,但有一些原则可以指导您做出更好的选择:1.组相关状态。如果您总是同时更新两个或多个状态变量,请考虑将它们合并为一......
  • jdk20 Structured Concurrency 结构化并发官网示例
    此特性还在孵化,后续版本可能有变动//全部执行直到有失败的任务Stringhandle()throwsExecutionException,InterruptedException{try(varscope=newStructuredTaskScope.ShutdownOnFailure()){Future<String>user=scope.fork(()->"")......
  • 汇编_将数据、代码和栈放入不同的段
    数据放在哪里之前的程序,只有一个代码段,需要运算的数据直接编码在代码里,例如:movax,1。如果我们想计算多个数求和,不能也傻乎乎的add多次,因为多个数可能是不一样,循环都不可以用。我们需要一段安全的空间用来存放数据。它更像是一个数组,占据一段连续的内存空间,通过[bx++]方式,可以对......
  • 嵌入汇编
    嵌入汇编语句的基本格式为:asm("汇编语句"      :输出寄存器      :输入寄存器      :会被修改的寄存器       );常用的寄存器约束的缩写:r:I/O,表示使用一个通用寄存器,由GCC在%eax/%ax/%al、%ebx/%......
  • 05-目录-计算机基础(组成原理、微机原理、汇编、操作系统、网络)
    :链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接:链接12:链接13:链接14:链接15:链接16:链接17:链接18:链接19:链接20:链接:链接:链接:链接:链接:......