1、一个32位的有符号数防在DX:AX中,写出求其补码的程序片段(2种方法)!
2、写出执行以下指令的序列,其中X,Y,Z,R都是16位带符号数地址!
Z<-W+(Z-X)
Z<-(W+X)/(Y+6) R<-余数
3、写一求地址F000:0000H开始的64K字节内存区域的检验和并转换为16近制数的ASCII码!
//注:用8086/8088的汇编指令!
ax不能用于寄存器间接寻址方式
帮你up一下。
1.与FFH求异或后加1
2.直接用FFH减去它
1.
一个正数的补码就是原码;一个负数的补码就是它的无符号数原码的反码加1。
对于一个已经存放在DX:AX中的数来说,它的存在就是补码。还求什么?
1)方法一:直接以16进制的形式显示。
2)方法二:
PUSH AX
PUSH DX
POP AX
NEG AX ;求补
NEG AX ;再求补
MOV DX,AX
POP AX
NEG AX
NEG AX
2.
1)
MOV AX,Z
CLC
SBB AX,X
SBB AX,W
MOV Z,AX
2)
MOV AX,6
CLC
ADC AX,Y
MOV BX,AX
PUSH BX
MOV AX,W
CLC
ADC AX,X
MOV BX,AX
MOV AX,0
SBB AX,BX
CWD
POP BX
IDIV BX
MOV Z,AX
MOV R,DX
3.
CHANGE PROC NEAR
push dx
push cx
push ax
mov cx,4
shr al,cl
cmp al,0ah
jb sh1
add al,07h
sh1: add al,30h
mov dh,al
pop ax
and al,0fh
cmp al,0ah
jb sh2
add al,07h
sh2: add al,30h
mov dl,al
mov ax,dx
pop cx
pop dx
ret
CHANGE ENDP
START: MOV AX,0F000H
MOV DS,AX
MOV AX,0
MOV SI,AX
MOV CX,AX ;64k长度
REPADD:ADD AX,[SI] ;校验和.如果是类加和就还得处理进位.
INC SI
LOOP REPADD
PUSH AX
MOV AL,AH
CALL CHANGE
MOV DX,AX
POP AX
CALL CHANGE
转换出来的结果以16进制的ASCII码形式存放在DX:AX里。