数据处理的两个基本问题2

149 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 8.6寻址方式的综合应用

汇编和C的对比

image.png  

一般来说用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素

image.png

image.png 8.7div指令

除数、被除数的存放

image.png 结果的存放

image.png

 

 

div指令格式

div reg

div内存单元

image.png 相对基址变址寻址

image.png  

 

通过乘法来模拟除法

 

div指令格式:

div reg(寄存器)

div mem(内存单元)

 

编程实现1(除数16位)-->被除数32位

image.png

编程实现2(除数8位)-->被除数16位

image.png  

 

8.8伪指令dd

前面用db和dw定义字节型数据和字型数据

 

dd是用来定义dword(double word双字)型数据的。(32字节)

 

 

CPU64位

操作系统64位

在操作系统上工作的软件64位

image.png  

问题8.1

image.png

assume ds:data,cs:code
data segment
	dd 100001
	dw 100
	dw 0
	
data ends
code segment
start:	mov ax,data
	mov ds,ax
	mov dx,ds:[2]
	mov ax,ds:[0]
	div word ptr ds:[4]
	mov ds:[6],ax
	
	mov ax,4c00h
	int 21h
	
code ends
end start

 

 

8.9dup

dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号

 

image.png dup示例

 

image.png

 

dup实操

image.png 一共十六个字符

image.png

ATTENTION(关于定义字型数据):

  1. eg: 例如db '12345678990123456'(字节型数据)

此时字符串1234567890123456超过了一个字节的大小,会自动补充字节空间将剩余字符串填入

assume cs:code,ds:data
data segment
	db 21 dup ('1234567890123456')
data ends
code segment
start:	mov ax,data
	mov ds,ax
	
	mov ax,4c00h
	int 21h
code ends
end start

2.eg: 例如dw'a'(字型数据)

当字符串不足两字节,自动填充凑满

assume cs:code,ds:data
data segment
	dw 2 dup ('a')
data ends
code segment
start:	mov ax,data
	mov ds,ax
	
	mov ax,4c00h
	int 21h
code ends
end start

记录一次报错

error A2084:constant value too large

(常数值过大

Q:why

A:dw 是定义字型数据(占两个字节),而一个字符只占一个字节,‘40’是2个字节,刚好占一个字型数据

dw 'XX' ,单引号里面必须 小于 或者 等于 2个,cpu应该是这样子的,他每个 单引号 的内容作为 一个字型数据,所以 里面的数据不能大于 2个字节, 只能小于或者等于2个自己,如果是小于2个字节,你就会在高位自动加 0 填补, 如果你只想显示3个字符的那,你可以这样 dw '13','7'  这样也是一样的。

 

 

只有db可以将整个字符串在同一对单引号内给出

详见下文tips