汇编语言上机考试三星题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

你可能感兴趣的:(汇编语言上机考试三星题6(二刷))