2013-09-18 10 views
3

Итак, я выполняю свое первое задание для класса сборки x86, и я уже потерял (отлично). Возможно, я читаю это неправильно, но мне кажется, что мне нужно преобразовать байт в слово, которое я могу сделать, и двойное слово к слову, которое я не имею ни малейшего представления о том, как это сделать. Учитывая, что я много раз оглядывался, я предполагаю, что не понимаю, что мне нужно делать. Вот подсказка:Преобразование между байтами, словами и двойными словами

Примем следующие определения в сегмент .data:

arrayB: db 170, 193, 57 

arrayW: dw 0, 0, 0 

arrayD: dd 517, 1045, 2000 

написать программу для сборки, что эквивалентно нижеследующих утверждений языка высокого уровня:

arrayW[0] = arrayB[0] + arrayD[0]; 

arrayW[1] = arrayB[1] + arrayD[1]; 

arrayW[2] = arrayB[2] + arrayD[2]; 

Заранее спасибо; Я понятия не имею, что я делаю (как в сборке, так и на SO, так жаль об этом).

ответ

1

Я думаю, что язык высокого уровня будет скулить об этом. (но кто заботится о том, что делает HLL?) Вы совершенно правы, чтобы нервничать по поводу превращения двойного слова в слово. Вы не можете этого делать, в общем, без потери информации. В этом случае мы можем убедиться, что все три числа в массиве двойных слов будут вписываться в слова, поэтому вы можете просто обрезать их и называть «преобразованными», я думаю. (ужасное назначение, ИМХО)

Что может дать вам больше проблем - это массивы трех разных размеров. Индекс 0 легко. Но для индекса 1 вам нужно получить байт от [arrayB + 1], добавьте его к двойному слову, усеченному до слова от [arrayD + 4], и сохраните полученное слово в [arrayW + 2]. Вероятно, вы можете выяснить, какой индекс 2 будет выглядеть. Вы говорите, что знаете, как сделать байт для части слова, так что вы знаете, если вы сделаете «mov ax, [ArrayB]», он получит как 170, так и 193, верно?

Сделайте снимок и вернитесь, если у вас возникли проблемы с кодом.

+0

Отлично, спасибо. У меня действительно возникли проблемы с паролем, но я перепечатал сегмент .data, и он был исправлен. Глупые невидимые персонажи. – noseonarug17

0

Это довольно простая задача, но есть некоторые крошечные моменты. Сначала, если вы хотите преобразовать больший тип данных в меньший, вы должны убедиться, что значения достаточно малы, чтобы вписаться в меньшую переменную типа. В вашем случае это «слово», и все числа достаточно малы, чтобы вписаться в два байта.

Вторая проблема - знак чисел. Они подписываются или не подписаны? В этом примере есть только положительные числа, но вы должны прояснить это в общем случае.

Преобразование от меньшего до более высокого переменного размера довольно простое, вы должны использовать movzx для неподписанных переменных или movsx для подписанных.

Преобразование из большего размера в меньший размер данных еще проще. Вы просто должны использовать нижнюю часть номера и игнорировать более высокую часть.

Вот простая реализация (FASM синтаксис):

movsx ax, [arrayB]   ; it is arrayB[0] 
    add ax, word [arrayD]  ; it is the lower word of arrayD[0] 
    mov [arrayW], ax   ; it is arrayW[0] 

    movsx ax, [arrayB+1]  ; arrayB[1] 
    add ax, word [arrayD+4] ; arrayD[1] - note the array element size is 4 bytes long. 
    mov [arrayW+2], ax  ; arrayW[1] - array element size is 2 bytes. 

    movsx ax, [arrayB+2]  ; arrayB[2] 
    add ax, word [arrayD+8] ; arrayD[2] 
    mov [arrayW+4], ax  ; arrayW[2] 
0

Вы можете обнулить-расширения (без знака) и знак-расширения (подпись) байта/слова для слов/двойных слов, используя инструкции MOVZX и MOVSX.

Например:

movzx ax,byte [arrayB + 0] ; ax becomes 0x00AA (== 170) 
movsx ebx,byte [arrayB + 0] ; ebx becomes 0xFFFFFFAA (== -86) 

Чтобы сузить значение из двойного слова в слово, вы можете просто захватить нижнее слово. Имейте в виду, что если слово dword содержит ненулевые биты в своем верхнем слове, вы потеряете эту информацию (это не проблема со значениями, которые вы указали в своем вопросе, хотя они все вписываются в 16 бит):

mov ax,word [arrayD + 4] ; put the lower word of the 2nd dword in ax 
Смежные вопросы