2013-09-24 1 views
1

Мне нужно написать программу сборки, которая вычисляет (a * (bc) * d), где a, b, c, d являются переменными, хранящимися в сегменте данных в подписанном 8 -битный формат. (я должен предположить, что результат представлен в виде подписанного 32-разрядного числа)x86 Ассемблер Asm. Разница между подписанной и неподписанной - и переменной 8 и 16

Я написал следующий код

data segment 

    a db 1 
    b db 9 
    c db 3 
    d db 4 

    x dw ? 


ends 

stack segment 
    dw 128 dup(0) 
ends 

code segment 
start: 

    mov ax, data 
    mov ds, ax 
    mov es, ax 


    ; what would the difference be in the following three lines if the variables where signed? 
    mov al, b 
    sub al,c 
    mul a 
    mul d 


    ;treating result as a 16bit - how about signed? 
    mov x,ax 





    mov ax, 4c00h ; exit to operating system. 
    int 21h  
ends 

end start 

Мои вопросы заключаются в следующем: Каковы различия в мне нужно знать, обрабатывая числа как подписанные и подписанные, кроме размеров регистра (al, ah, bh, bl, ecc ... 8bit), (ax, bx, cd, dx, 16bit)?

Как обрабатывать 32-битную переменную, отличную от переменной 16, кроме сохранения ее переменной DW?

Для вашего удобства я написал короткую версию вышеперечисленных вопросов в соответствующих частях кода.

Может кто-нибудь, пожалуйста, помогите мне, пожалуйста? Заранее благодарим за ваше время.

ответ

3

В общем, содержимое регистров/памяти представляет собой просто последовательности (с определенной длиной) бит, а концепция подписанного/unsigned не имеет значения.

Есть несколько инструкций, где важно, следует ли рассматривать операторы как подписанные или неподписанные. Вот некоторые примеры:

  • Размножение: Используйте MUL для беззнаковых операндов, и IMUL подписанных операндов.
  • Отдел: используйте DIV для неподписанных операндов и IDIV для подписанных операндов.
  • Условные прыжки: JA означает прыжок, если (без знака) выше, JG означает прыжок, если (подписан) больше. JB означает jump if (без знака) ниже, JL означает прыжок, если (подписанный) меньше, и так далее.

;treating result as a 16bit - how about signed? 
mov x,ax 

MOV понятия не имеет знака, она просто копирует биты от источника к месту назначения. Все, что ему нужно знать, - это количество бит для копирования (т. Е. Размер операндов).

Единственное исключение, если вы используете расширяющийся MOV:

movzx ax,byte ptr [foo] ; zero-extend the byte foo into ax (for unsigned numbers) 
movsx ax,byte ptr [foo] ; sign-extend the byte foo into ax (for signed numbers) 

Как лечить 32 бит переменная а иначе, чем 16 переменной, кроме сохранения его Ито переменную DW ?

DW будет для 16-разрядной переменной. Для 32-битной переменной вы должны использовать DD.