Разделить в Assembly TASM [дубликат]

Вот довольно краткий способ выполнения конкатенации:

>>> s = "hello world"
>>> ''.join(str(ord(c)) for c in s)
'10410110810811132119111114108100'

И своего рода забавная альтернатива:

>>> '%d'*len(s) % tuple(map(ord, s))
'10410110810811132119111114108100'
5
задан Sep Roland 21 May 2017 в 20:17
поделиться

1 ответ

Этот вопрос является разновидностью других сбоев, связанных с делением. В теге x86 wiki есть некоторые дополнительные ссылки:


По-видимому, случайный код, который ваш отладчик, похоже, перескакивает это обработчик арифметических исключений (также тот же, что и Divide by Zero). Случается, что ваш код испытывает Division Overflow. Вы делаете 16-битный / 8-битный IDIV . Из документации:

Подписанное разделение AX на r / m8 с результатом, сохраненным в: AL ← Quotient, AH ← Remainder.

Вы заметите, что для деления с 8-разрядным делителем (в вашем случае BL ) диапазон для частного составляет от -128 до +127. 044c0h IDIV 85 составляет 207 (десятичный). 207 не помещается в подписанный 8-битный регистр, поэтому вы получаете переполнение подразделения и причину своей неожиданной проблемы.

Чтобы решить эту проблему, вы можете перейти к 16-разрядному делителю. Поэтому вы можете поместить свой делитель в BX (16-разрядный регистр). Это будет mov bx, 85. К сожалению, это не так просто. При использовании 16-разрядного делителя процессор предполагает, что дивиденд составляет 32 бита с высокими 16 битами в DX и младшими 16-битами в AX .

< blockquote>

Подписанное разделение DX: AX на r / m16, с результатом, хранящимся в AX ← Quotient, DX ← Remainder.

Чтобы решить эту проблему, вы должны подписать расширение 16-битного значение в AX . Это просто, поскольку вам нужно использовать инструкцию CWD после размещения значения в AX . Из ссылки на набор команд

DX: AX ← sign-extend от AX.

Эффективно, если самый значащий бит (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
7
ответ дан Community 19 August 2018 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: