编写程序(用汇编语言编写) 1,两个省人口数(99887766人,66554433人)相加,结果存放在相邻内存中。

2,求十进制数的累加和,即求1+2+...+99的结果,该结果也用BCD表示。
3,编写程序将ELEMS中的100个字节数据的位置颠倒过来,即第1与第100个字节内容交换,第2个与第99个字节内容交换,.........
4,编写符号函数Y=sign X的三分支程序。
一起四道题,拜托快点~~写的好 可以追加悬赏!!!!!!

第一题:
.model small
.stack 8192
.data
pop1 dd 99887766
pop2 dd 66554433
sum dd ?

.code
main: mov ax,@data
mov ds,ax

;这里开始是做加法的代码

mov ax,word ptr pop1
mov dx,word ptr pop1[2]
add ax,word ptr pop2
adc dx,word ptr pop2[2]
mov word ptr sum,ax
mov word ptr sum[2],dx

;至此结果放在双字变量sum中,sum与pop2是相邻的

mov ah,4ch
int 21h
end main

第二题:
.model small
.stack 8192
.data
sum dw ?
sumbcd dw ?

.code
main: mov ax,@data
mov ds,ax

xor ax,ax ;累加器清零
mov cx,99 ;cx是循环变量
lp1: add ax,cx ;从99倒着加到1,和在AX里
loop lp1
mov sum,ax ;至此sum里存了累加和本身

mov si,10 ;下面通过除以10,将该和的每个数字剥离出来、并转为BCD码存到sumbcd里
xor bx,bx ;bx里用来存bcd码结果
mov cx,4 ;转BCD时每个数字要将bx右移4位,在把AH里的余数合并到dx的最高4位上,4次之后形成整个BCD结果
lp2: xor dx,dx ;为除法清除dx内容
div si ;8位除法完成后,dx内是每次的余数,ax里是商。第一次除完余数是个位、下次是十位……
push cx ;下面移位需要用CL寄存器,但CX用来做循环控制变量,所以需要先保存一下
mov cl,4 ;这里的cl为4是用来循环用
shr bx,cl ;将BX右移4位,左边会补0
shl dl,cl ;DL左移4位,右边补零
or bh,dl ;BX左边的4个补入的0填上DL里的余数的那个数位
pop cx ;恢复CX里的循环次数
loop lp2
mov sumbcd,bx ;sumbcd里存了BCD的结果,注意是十位、个位合并为一个字节在前面、千位和百位合并为另一字节在后面

mov ah,4ch
int 21h
end main

第三题:
.model small
.stack 8192
.data
elem db 10 dup ('0123456789')
tail equ $

.code
main: mov ax,@data
mov ds,ax

mov si,offset elem ;si指针从前向后走
mov di,offset tail-1 ;di指针从后向前走
lp: cmp si,di ;比较两个指针
jge done ;如果si>=di,则头尾已经相遇了,则结束
mov al,[si] ;al里取前面指针处的内容
xchg [di],al ;和后面指针处交换
mov [si],al ;存回前面指针处
inc si ;移动前指针
dec di ;移动后指针
jmp lp ;继续下个
done:

;至此elem内容已经如要求交换完

mov ah,4ch
int 21h
end main

第四题:
.model small
.stack 8192

.code
main: mov ax,-100
call sign
mov ax,100
call sign
mov ax,0
call sign

mov ah,4ch
int 21h

sign proc
cmp ax,0 ;ax与0作比较
jz sign1 ;是0的话直接返回(结果不用变,还是0)
mov ax,1 ;其它两种情况分别返回+1或-1,先设定为正1,注意MOV指令不影响刚才CMP比较的结果标志位
jg sign1 ;如果刚才比较得到ax>0,转返回(现在AX里是表示正数的1)
neg ax ;把AX里的1变成-1
sign1: ret ;返回,值在AX里
sign endp

end main
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-25
8086?
相似回答