Я продолжаю читать, что для того, чтобы выполнить деление регистра на целое/с плавающей запятой, выполняемые регистры должны быть на самом деле initialized
. Мне любопытно, какая правильная директива ассемблера для этого. Я просто предоставляю адрес примерно так:
mov ecx, 0x65F ;0x65F represents an address for ecx to point to
.
А затем быстро (позже в коде) сделайте что-то вроде:
mov byte [ecx], 0xA ;move the value of 0xA into the contents of ecx, using only a byte's worth of data
Это правильный способ выполнить такую операцию? Если нет, то что?
Обновить
Итак, что я пытаюсь сделать, так это умножить два значения и вывести их на экран. Код выглядит следующим образом, и по какой-то причине каждый раз, когда я пытаюсь разделить edx
, я получаю либо ошибку сегментации, либо арифметическое исключение с плавающей запятой. Может ли кто-нибудь объяснить мне, что я делаю неправильно?
Код
section .data
counter: db 0xA ;store value 10 in 'counter', while allocating only one byte. This will be used for decrementing purposes
section .bss
valueToPrint: resb 4 ;alloc 4 bytes of data in 'valueToPrint'
section .text
global _start
_print_char:
add eax, '0' ;convert to ascii
mov [valueToPrint], eax ;store contents of 'eax' in valueToPrint
mov eax, 4 ;syswrite
mov ebx, 1 ;stdout
mov ecx, valueToPrint ;machine will take whatever value exists in 'ecx' and print
mov edx, 1 ;print only a single byte's worth of data
int 0x80 ;invoke kernel to perfrom instruction
ret
_convert_values:
mov edx, 0xA ;dividing eax by 10, which will lower its tens place
div edx ;(**Program crash here**)do division: remainder SHOULD be stored in edx
mov byte [edx], 0x0 ;zero out edx
call _print_char ;do printing for latest character
dec byte [counter] ;decrement counter
mov dword [eax], counter ;store counter in eax
jnz _convert_values ;while eax > 0 continue process
_endl:
mov eax, '\n' ;store newline character in eax to be printed
call _print_char ;print value
ret
_mul:
mov eax, 0x2A ;store 42 in eax
mov edx, 0x2B ;store 43 in edx
mul edx ;multiply [eax] * [edx]
ret
_safe_exit:
mov eax, 1 ;initiate 'exit' syscall
mov ebx, 0 ;exit with error code 0
int 0x80 ;invoke kernel to do its bidding
_start:
nop ;used to keep gdb from complaining
call _mul ;multiply the values
call _convert_values ;do hex to ascii conversion
jmp _safe_exit ;use jmp as opposed to call since it technically doesn't 'ret'
edx
, прежде чем выдавать инструкциюdiv
. - person Mysticial   schedule 30.06.2012edx
? Если я правильно понимаю, обнуление регистра означает обнуление старшей половины байта. Это правильно? Я пробовал иand
, иxor
наedx
, и ни один из них не работал. Инструкции, приведенные в обоих этих вопросах/ответах, к сожалению, не помогли. - person zeboidlund   schedule 01.07.2012