第一题:
.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
温馨提示:答案为网友推荐,仅供参考