大侠门 帮忙写个很小的汇编程序

来源:百度知道 编辑:UC知道 时间:2024/06/27 15:45:01
功能是:BUF数据区中存放字节数据,将正数送入BUF1区中,负数求绝对值之后送入BUF2区中,并统计正、负个数,送入变量VAR1和VAR2 中
试写出编程思路、画程序框图,写出详细程序附详细注释

MODEL SMALL
.STACK
.586
.DATA
BUF DB X DUP (?)
BUF1 DB Y DUP (?)
BUF2 DB (X-Y) DUP (?)
VAR1 DW 0 (DW表示的是一个字,一般汇编中代表2个字节也就是16位)
VAR2 DW 0
BIT7 EQU 80H(使BIT7=80H,值得注意的是只有最高位为1)
.CODE
START:
MOV AX, @DATA (一般有数据段的程序,这句以及下面两句代码是必不可少的,意思把上面的数据表赋给数据段和附加段)
MOV DS, AX
MOV ES, AX
LEA SI, BUF ;用三个指针分别指向三个缓冲区 (在8086中常用作指针的寄存器只有SI,BX,DI,因此只有它们可以用来做寄存器间接寻址)这句指令的意思是把BUF的首地址赋给SI。那么后面就可以用[SI]来代表内存了。
LEA BX, BUF1
LEA DI, BUF2
MOV CX, X ;cx=要处理的数据总数 (CX一般用来最计数器,比如这一题用来计数要处理的数据总数)
go_on_next:
lodsb
TEST AL, BIT7 ;正数? (不难发现上面定义的BIT7值为80H,TEST指令相当于AND指令,只不过不保留结果,但会影响标志位,比如标志位Z,这条指令检测最好位,既符号位)
JZ positive_number ;yes,jmp (如果符号位Z=0,那么说明AL中的数值是正数,那么跳转到positive_number: 处执行,如果Z不为0那么顺序执行下面的指令 )
neg al ;负数取补
STOSB ;存入buffer2
INC VAR2 ;负数计数加一
JMP next_number 无条件跳转到 next_number:
positive_number: (这句代表下面是正数的处理)
MOV DS:[BX],AL (把AL中的数值传到 数据段中偏移量为BX的内存中)