2017-02-12 34 views
3

Ниже приведен мой код. Блок в hex2dec успешно работает для преобразования одного шестнадцатеричного числа в десятичное число. Было бы очень полезно, если бы кто-нибудь мог указать, где я ошибался в использовании массива. Благодарю.Преобразование массива шестнадцатеричных чисел в десятичные числа Intel 8086 Язык сборки

DATA SEGMENT 
    NUM DW 1234H,9H,15H 
    RES DB 3*10 DUP ('$','$','$') 
    SIZE DB 3 
DATA ENDS 

CODE SEGMENT 
    ASSUME DS:DATA, CS:CODE 
START: 
    MOV AX, DATA 
    MOV DS,AX 
    MOV DI,0 
    LOOP3: 
    MOV AX,NUM[DI] 
    LEA SI,RES[DI] 
    CALL HEX2DEC 
    LEA DX,RES[DI] 
    MOV AH,9 
    INT 21H 
    INC DI 
    CMP DI,3 
    JL LOOP3 
    MOV AH,4CH ; end program 
    INT 21H 
CODE ENDS 

HEX2DEC PROC NEAR 
    MOV CX,0 
    MOV BX,10 
    LOOP1: 
    MOV DX,0 
    DIV BX 
    ADD DL,30H 
    PUSH DX 
    INC CX 
    CMP AX,9 
    JG LOOP1 
    ADD AL,30H 
    MOV [SI],AL 
    LOOP2: 
    POP AX 
    INC SI 
    MOV [SI],AL 
    LOOP LOOP2 
    RET 
HEX2DEC ENDP 
END START 

ответ

2
MOV AX,NUM[DI] 
LEA SI,RES[DI] 
LEA DX,RES[DI] 

Вы лечите DI как индекс массива, как мы используем в любом из языков высокого уровня. При программировании сборки мы используем только смещения aka смещения в массиве.

В вашей программе, так как массив NUM состоит из слов, вы должны дать DI регистр последовательно значения 0, 2 и 4.

ADD DI, 2 
CMP DI, 6 
JB LOOP3 

Кроме того, было бы лучше, чтобы не обработать RES как массив. Просто считайте его буфером и всегда используйте его с самого начала.

RES DB 10 DUP (0) 
... 
LEA SI, RES 
CALL HEX2DEC 
LEA DX, RES 

Лучший вариант Hex2dec избегает уродливые префиксом «0» на одной цифры номера:

HEX2DEC PROC NEAR 
    XOR CX, CX  <--- Same as MOV CX,0 
    MOV BX,10 
LOOP1: 
    XOR DX, DX  <--- Same as MOV DX,0 
    DIV BX 
    ADD DL, 30H 
    PUSH DX 
    INC CX 
    TEST AX, AX 
    JNZ LOOP1 
LOOP2: 
    POP AX 
    MOV [SI], AL 
    INC SI 
    LOOP LOOP2 
    MOV AL, "$"  <--- Add this to use DOS function 09h 
    MOV [SI], AL 
    RET 
HEX2DEC ENDP 
+0

я переставлял INC DI с ADD, как предложено вами, а также изменен RES, чтобы он всегда работал как буфер. Тем не менее он дал неверный ответ. – Anurag

+0

Вы завершили строку с символом ** $ ** для каждого вывода? –

+0

Вы уверены, что ваш ассемблер не требует, чтобы вы писали 'MOV AX, @ DATA'' MOV DS, AX'? Поэтому добавление ** @ **. –