Вот довольно краткий способ выполнения конкатенации:
>>> s = "hello world"
>>> ''.join(str(ord(c)) for c in s)
'10410110810811132119111114108100'
И своего рода забавная альтернатива:
>>> '%d'*len(s) % tuple(map(ord, s))
'10410110810811132119111114108100'
Этот вопрос является разновидностью других сбоев, связанных с делением. В теге x86
wiki есть некоторые дополнительные ссылки:
blockquote>
idiv
/div
проблемы: Нульedx
сначала или sign-extendeax
. . 32bitdiv
, если коэффициент 64b / 32b => 32b на самом деле не соответствует 32b.
По-видимому, случайный код, который ваш отладчик, похоже, перескакивает это обработчик арифметических исключений (также тот же, что и Divide by Zero). Случается, что ваш код испытывает
Division Overflow
. Вы делаете 16-битный / 8-битный IDIV . Из документации:Подписанное разделение AX на r / m8 с результатом, сохраненным в: AL ← Quotient, AH ← Remainder.
blockquote>Вы заметите, что для деления с 8-разрядным делителем (в вашем случае BL ) диапазон для частного составляет от -128 до +127. 044c0h IDIV 85 составляет 207 (десятичный). 207 не помещается в подписанный 8-битный регистр, поэтому вы получаете переполнение подразделения и причину своей неожиданной проблемы.
Чтобы решить эту проблему, вы можете перейти к 16-разрядному делителю. Поэтому вы можете поместить свой делитель в BX (16-разрядный регистр). Это будет
< blockquote>mov bx, 85
. К сожалению, это не так просто. При использовании 16-разрядного делителя процессор предполагает, что дивиденд составляет 32 бита с высокими 16 битами в DX и младшими 16-битами в AX .Подписанное разделение DX: AX на r / m16, с результатом, хранящимся в AX ← Quotient, DX ← Remainder.
blockquote>Чтобы решить эту проблему, вы должны подписать расширение 16-битного значение в AX . Это просто, поскольку вам нужно использовать инструкцию CWD после размещения значения в AX . Из ссылки на набор команд
DX: AX ← sign-extend от AX.
blockquote>Эффективно, если самый значащий бит (MSB) в AX равно 0 DX станет 0. Если MSB равен 1, тогда DX станет 0ffffh (все биты установлены на единицу). Знак бит числа - это MSB.
Учитывая все это, ваш код разделения можно настроить, чтобы принять 16-разрядный делитель:
mov ax, 044c0h cwd ; Sign extend AX into DX (DX:AX = 32-bit dividend) mov bx, 85 ; Divisor is 85 idiv bx ; Signed divide of DX:AX by BX