MOV sum, 0
MOV CX, 100
LP:
TEST CX, 1
JE NEXT
ADD sum, CX
NEXT:
LOOP LP
RET
END; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; Subroutine 延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒182次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay1S Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov Times,dx
mov Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,Times
sbb cx,Times[2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret
Times dw 0,0
Delay1S EndP
; -----------------------------------------
Didas equ 18
Start: call Delay1S
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束只跟你说一下大体思想吧。其他的还是你自己作比较好。
1用指针SI和DI分别指向数据区和存储区首字节,则A2首地址为[SI+LENG],同样SUB1首地址为[DI+LENG]
然后用MOV AX,[SI];MOV BX,AX;ADD AX,[SI+LENG];MOV [DI],AX;MOV AX,BX;
SUB [SI+LENG];MOV [DI+LENG],AX然后指针后移ADD SI,2(如果是字节变量则为1)
2十进制转二进制就是用除2的办法。用DIV指令,对于字变量,商在AX中,余数在DX中。DX中的值只可能为1或0。再用SHR和ROR指令将DX的值移入寄存器BX中,注意所移动的位数。当AX中的值为1或0时,将其移入BX即结束。
显示的话,需将结果每一位转成ASCII码即可。
转八进制只需将转好的二进制从低到高三位一组转成ASCII码即可。还是使用移位指令,每次移三位即可。TO_123 PROC
MOV SI, 0
LP1:
MOV AH, string[SI]
CMP AH, 0
JE EXIT
CMP AL, 0
JNE EQ1
OR AH, 32
JMP NEXT
EQ1:
CMP AL, 1
JNE EQ2
AND AH, 32
JMP NEXT
EQ2:
XOR AH, 32
NEXT:
MOV string[SI], AH
INC SI
JMP LP1
EXIT:
RET
TO_123 ENDP可以。但有弊端 ADD OPRD1,OPRD21 OPRD1为任一通用寄存器或存储器 *** 作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器 *** 作数这给程序的编写带来了很大的方便OPRD2为立即数,也可以是任意一个通用寄存器 *** 作数立即数只能用于源 *** 作数
2 OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的, 但不允许两个都是存储器 *** 作数理由是指令代码的寻址方式中规定了两个 *** 作数(除立即数)至少有一个是寄存器 *** 作数
3 加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响以上标志也称为结果标志加法指令适用于无符号数或有符号数的加法运算 *** 作数可以是8位,也可以是16位 再谈INC,它不仅仅是一个加法指令,更是一个计数指令,INC 的主要功能是将指定位置的值加1,且不会对任何标志位有影响,将INC 搭配循环的使用,便成为最好的计数指令,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)