汇编语言(王爽版)学习笔记 第八章 数据处理的两个基本问题(2)

8.6 寻址方式的综合应用

实例

在这里插入图片描述
数据存放
在这里插入图片描述
确定需要修改的数据
在这里插入图片描述
确定修改的方法
在这里插入图片描述
根据上面的分析,程序如下:

mov ax,seg
mov ds,ax
mov bx,60h		;确定记录地址
mov word ptr [bx+0ch],38
add word ptr [bx+0eh],70

mov si,0		;用si来定位产品字符串中的字符
mov byte ptr [bx+10h+si],'V'
inc si
mov byte ptr [bx+10h+si],'A'
inc si
mov byte ptr [bx+10h+si],'X'

用C语言描述程序

struct company{//定义一个公司记录的结构体
			char cn[3];//公司名称
			char hn[9];//总裁姓名
			int pm;//排名
			int sr;//收入
			char cp[3];//著名产品
};
struct company dec = {'DEC','Ken Olsen',137,40,'PDF'};//定义一个公司记录
main()
{
			int i;
			dec.pm=38;
			dec.sr=dec.sr+70;
			i=0;
			dec.cp[i] = 'V';
			i++;
			dec.cp[i] = 'A';
			i++;
			dec.cp[i] = 'X';
			return 0;
}

根据C语言写出类似的汇编代码:

mov ax,seg
mov ds,ax
mov bx,60h		;确定记录地址
mov word ptr [bx].0ch,38
add word ptr [bx].0eh,70

mov si,0		;用si来定位产品字符串中的字符
mov byte ptr [bx].10h[si],'V'
inc si
mov byte ptr [bx].10h[si],'A'
inc si
mov byte ptr [bx].10h[si],'X'

一般来说,我们可以用[bx+idata+si]的方式来访问结构体中的数据。
用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素。


8.7 div指令

div是除法指令(division),使用div作除法的时候

  • 除数:8位或16位,在寄存器或内存单元中
  • 被除数:(默认)放在AX中,或者放在AX和DX中。如果除数是8位,则被除数是16位,放在AX中。如果除数是16位, 则被除数是32位,放在DX和AX中。DX存放高16位,AX存放低16位。
  • 结果:如果除数为8位,商存放在AL中,余数存放在AH中。如果除数为16位,商存放在AX中,余数存放在DX中。

div指令格式:

  • div reg
  • div 内存单元

在这里插入图片描述
在这里插入图片描述
编程1:利用除法指令计算100001/100

分析:被除数100001(16进制为186A1H)大于65535(16进制为FFFFH),不能用ax寄存器存放,所以我们要使用dx和ax两个寄存器联合存放。这里除数可以用8位寄存器存放,但是被除数是32位,所以除数存放在16位寄存器中。

mov dx,1		;高16位
mov ax,86A1h		;低16位
mov bx,100
div bx

程序执行后,(ax)=03E8(即1000),(dx)=1.

编程2:利用除法指令计算1001/100

分析:被除数1001可以用16位寄存器存放,除数100可以用8位寄存器存放,即进行8位的除法。

mov ax,1001
mov bl,100
div bl

程序执行后,(al)=0AH(即10),(ah)=1(余数为1)。


8.8 伪指令dd

前面我们用db和dw定义字节型数据和字型数据。
dd是用来定义dword(double word双字)型数据的。

data segment
db 1
dw 1
dd 1

如上在data段中定义了三个数据:
第一个数据为01H,在data:0处,占一个字节
第二个数据为0001H,在data:1处,占一个字(两个字节)
第三个数据为00000001H,在data:3处,占两个字(四个字节)

问题8.1

用div计算data段中第一个数据除以第二个数据后的结果,商存放在第三个数据的存储单元中。

data segment
	dd 100001
	dw 100
	dw 0
data ends

思考: 被除数是双字型,32位,高16位存在dx中,低16位存在ax中,除数是字型,16位。
低16位起始地址在内存空间ds:[0]处,高16位起始地址在内存空间ds:[2]处。

mov ax,data
mov ds,ax
mov ax,ds:[0]		;被除数低16位
mov dx,ds:[2]		;被除数高16位
div word ptr ds:[4]		;进行除法
mov ds:[6],ax

8.9 dup

dup是一个操作符,在汇编语言中通db、dw、dd等一样,也是由编译器识别处理的符号。
它是和db、dw、dd等数据配合伪指令一起使用的,用来进行数据的重复。

示例:
db 3 dup(0)
表示定义了3个字节,它们的值都是0,相当于db 0,0,0

db 3 dup(0,1,2)
定义了9个字节,它们是
0,1,2,0,1,2,0,1,2
相当于 db 0,1,2,0,1,2,0,1,2

db 3 dup('abc','ABC')
定义了18个字节,它们是
'abcABCabcABCabcABC'
相当于 db 'abcABCabcABCabcABC'

dup的使用格式:
在这里插入图片描述

发布了117 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43092232/article/details/105504095