Хорошо, у меня почти та же проблема, что и здесь: Печать шестнадцатеричного кода из dx с помощью nasm , но мой исходный код и проблемы немного отличаются, поэтому я решил опубликовать свой собственный вопрос относительно того, как решить эту проблему. В целом, я просто пытаюсь напечатать 16-битное значение в виде строки, используя nasm, у меня уже есть процедура printf, и у меня есть действующий рабочий код для печати шестнадцатеричных цифр как таковой:
; dx: 16 bit argument to print
printh:
pusha ; push all registers to stack
mov bx, dx ; bx = dx
shr bx, 12 ; bx = 0x000*
mov bx, [bx + HEX_TABLE] ; convert 4bit number to hex digit
mov [HEX_PATTERN + 2], bl ; replace in template string
mov bx, dx
shr bx, 8
and bx, 0x000f
mov bx, [bx + HEX_TABLE]
mov [HEX_PATTERN + 3], bl
mov bx, dx
shr bx, 4
and bx, 0x000f
mov bx, [bx + HEX_TABLE]
mov [HEX_PATTERN + 4], bl
mov bx, dx
and bx, 0x000f
mov bx, [bx + HEX_TABLE]
mov [HEX_PATTERN + 5], bl
mov si, HEX_PATTERN ; store start address of string for printf
call printf
popa ; pop registers from stack
ret
HEX_PATTERN: db '0x****', 0x0a, 0x0d, 0 ; null-char terminated string + LF + CR
HEX_TABLE: db '0123456789abcdef'
Проблема в том, что, пытаясь сделать код лучше, используя al oop, я получаю сообщение об ошибке, что я использую «недопустимые режимы адресации»:
printh_loop:
pusha
mov ax, 2
mov cx, 0
loop:
mov bx, dx
shr bx, [SHIFTS_TABLE + cx] ; offset by 12, 8, 4, 0 respectively
and bx, 0x000f ; mask to keep last 4 bits
mov bx, [bx + HEX_TABLE] ; convert 4 bit digit to ascii value
mov [HEX_PATTERN + ax], bl ; HEX_PATTERN[ax] = bl
cmp cx, 3
inc cx ; increment counters
inc ax
jne loop
mov si, HEX_PATTERN ; set string address to use for printf
call printf
popa
ret
HEX_PATTERN: db '0x****', 0x0a, 0x0d, 0 ; null-char terminated string + LF + CR
HEX_TABLE: db '0123456789abcdef'
SHIFTS_TABLE: db 'C840'
В строках, где я выполняю shr bx, [SHIFTS_TABLE + cx] и mov [HEX_PATTERN + ax], bl
Я почти уверен, что должен быть способ написать эффективный код, но Я в целом достаточно 1020 * в сборке, поэтому любая помощь в этом вопросе очень ценится
Редактировать: Вот пример ошибки
nasm -fbin main.asm -o main.bin
printh.asm:11: error: invalid effective address
make: *** [makefile:2: main.bin] Error 1