汇编语言上机考试三星题6(二刷)
6.在BUFFER中定义了的十个带符号字,将其中的负数变成绝对值,并以十进制方式输出。
重要提示:
这道题的思路来自学长的代码,他的十六进制转十进制用的字符串,太机智了。
定义好BUF1,BUF10,然后先对BUF1的每一个字进行判断,是负数就NEG
然后进行输出,首先输出第一个数,把DI置4,也就是00000的最后一位,然后把那个字类型的16进制数除10,这时候余数存在DX中,因为余数不会大于10,所以直接在DL取,加30H之后就直接进行替换,然后减DI,重新让DX置零,再做除法,这里结束判断标志是DI小于0,DI=FFFF,所以不能用JNB,应该用JGE,因为对无符号数来说,FFFF>0
然后让DI+11,因为00000,00000一共是11。在进行上述除法操作,结束标志是BUF10[DI]=‘,’。
再九号调用输出就可以了。
DATAS SEGMENT
BUF1 DW 0FFFEH,0FFFFH,0FFFFH,0FFFFH,0FFFFH,0901H,0FFFFH,0FFFFH,0FFFFH,0FFFFH
BUF10 DB '00000,00000,00000,00000,00000,00000,00000,00000,00000,00000',0DH,0AH,'$'
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV SI,0
L:
CMP SI,20
JE DISP
MOV AX,BUF1[SI]
CMP AX,0
JG NOTFU
NEG AX
NOTFU:
MOV BUF1[SI],AX
ADD SI,2
JMP L
DISP:
MOV SI,0
MOV DI,4
MOV CX,10
MOV AX,BUF1[SI]
LOOP1:
MOV DX,0
DIV CX
ADD DL,30H
MOV BUF10[DI],DL
DEC DI
CMP DI,0
JGE LOOP1
LOOP2:
ADD DI,11
ADD SI,2
CMP SI,20
JE END0
MOV AX,BUF1[SI]
LOOP3:
MOV DX,0
DIV CX
ADD DL,30H
MOV BUF10[DI],DL
DEC DI
CMP BUF10[DI],','
JNE LOOP3
JMP LOOP2
END0:
LEA DX,BUF10
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START