顺序程序设计
一、 实验目的:
- 能够熟练的进行顺序程序的编写,掌握基本的汇编语言指令的用法
- 通过程序设计理解掌握不同类型的数据混合运算的基本规则
- 熟练掌握各种寻址方式,深入理解逻辑地址和物理地址的相关概念
二、 实验内容
有三个长度分别为1、2、4个字节的数据,编写程序求和存放到内存中。
程序1:三个数据均为无符号数,求和的结果考虑进位的存储。
程序2:三个数据均为有符号数,求和的结果不考虑进位的存储(进位直接丢掉)
请尽量使用各种寻址方式实现以上功能。
提示 - 数据只有在长度一致(包含编码一致)的情况下才能运算,因此要考虑将所有的数据转换成统一的长度(本题可以将所有的数据转换成4个字节长再运算)。
- 符号数和无符号数的转换规则不一样(无符号数扩展时高位直接加0,有符号数用CBW、CWD指令)
- 通常,当数据的运算结果比原始数据的位数多的时候,结果的数据的存储单元的长度考虑为计算数据的宽度的两倍,例如,变量x的长度为8位,则计算X*X的结果应该用16位存储,以此类推。
- 在数据定义的时候,以下的定义语句的数据在内存中存储的结果是一样的。
X Word 1234h X byte 34H,12H
X Dword 12345678H X byte 78H,56H,34H,12H - 16位的机器在一次加法中只能处理16位,若在16位的机器中运算一个32长的数据,只能先算低16位的数据,然后算高16位的数据时加上低位的进位。
三、 实验过程
编写源代码,完成后截图源代码
1
include io32.inc
;开始数据段的定义,分别定义长度为1、2、4的3个带符号的数据
.data
x byte 0fbh ;-5
y word 8000h ;-32768
z dword 0ffff8000h ;-32768
result dword ?
;*********************************************************************************
.code
start:
;符号扩展成为4个字节长的数据,注意cbw,cwd指令的用法
mov al,x
cbw
cwd
mov bx,ax
mov cx,dx
;符号扩展y
mov ax,y
cwd
;计算x+y
add ax,bx
adc dx,cx
;计算和z相加的结果
add ax,word ptr z
adc dx,word ptr z+2
;保存结果
mov word ptr result,ax
mov word ptr result+2,dx
call dispsid
exit 0
end start
2
include io32.inc
;定义数据段,其中存放了4个变量,长度分别为1、2、4、8个字节
;一般情况下,源程序中书写顺序连续的变量在内存中存储时也是连续的,因此本例中rusult从源代
;码看是定义了两个数据,但程序将其处理成一个8字节的变量
.data
x byte 11h ;1byte
y word 0ffffh ;2byte
z dword 0ffffffffh ;4byte
result dword 0,0 ;8byte
;*********************************************************************************
.code
start:
;以下代码将x从一个字节变为4个字节,结果放到dx:ax中
mov al,x
xor ah,ah
xor dx,dx
;以下代码将y从两个字节变为4个字节,结果放到Cx:Bx中
mov bx,y
xor cx,cx
;完成x+y的运算,结果放在dx:ax中
add ax,bx ;x和y的低16位相加,若有进位放到cf标志位中
adc dx,cx ;x和y的高16位相加,同时加上低位产生的进位
;本例中由于高位为0,因此看不到扩展的过程
add ax,word ptr z ;最低16位相加
adc dx,word ptr z+2 ;次低16位相加
mov cx,0 ;次高16位相加,高位为0,两个0相加,再加低位进位
adc cx,0
mov bx,0 ;高16位相加,高位为0,两个0相加,再加低位进位
adc bx,0
;保存结果,注意是如何将定义的两个四字节数据当做一个8字节变量处理的
mov word ptr result ,ax
mov word ptr result+2 ,dx
mov word ptr result+4 ,cx
mov word ptr result+6 ,bx
call dispuid
exit 0
end start