Целочисленное умножение и индексированная адресация - PullRequest
0 голосов
/ 07 апреля 2019

Мой учитель назначил нам этот лист, и это действительно доставляет мне неприятности.У меня возникают проблемы с точным знанием того, на что я должен умножить или разделить инструкцию индекса, а затем на основании этого определяю переполнение.

Например, для буквы E у нас есть

imulw 12(%ebx, %edx, 8)

, и регистры, которые изменяются, являются dx: ax, поскольку размер операнда составляет 16 бит.Ответ получается

0004:CA63

, но мне трудно понять, откуда взялся 0004.

worksheet teacher gave us

1 Ответ

0 голосов
/ 07 апреля 2019

Вас спросили, что сделает компьютер.Поэтому спросите у компьютера, что он будет делать (https://youtu.be/xaVgRj2e5_s?t=167):

# Linux:
# Name:     computer.s (capital S if compiled in Windows)
# Compile:  gcc -m32 -o computer computer.s
# Run:      ./computer  (Don't forget dot-slash!)

#if defined(__WIN32__)
    #define main _main
    #define printf _printf
#endif

.data
    arr:    .long 0x5, 0x7, 0x8, 0xD, 0x9, 0xC1A55ED, 0xDECADE, 0xFADEDBAD, 0x700300, 0x400800
    fmt:   .string "%c % 4X % 8X:%- 8X OF=%c\n"

.text
.global main
main:
    pushl %ebp
    movl %esp, %ebp
    subl $24, %esp              # Space for 6 DWORD à 4 byte
    andl $-16, %esp             # Align stack to 16

E:  call init
    lea 12(%ebx,%edx,8), %edi   # Claculate the operand and store it in EDI

    movl $arr, %ebx             # Modify EBX to point to arr
    imulw 12(%ebx, %edx, 8)     # Do it
    seto %cl                    # Store the overflow flag in CL
    or $0x30, %cl               # To ASCII
    movzwl %ax, %eax            # Clear garbage in EAX
    movzwl %dx, %edx            # Clear garbage in EDX

    movl $fmt, 0(%esp)          # Fill the stack with arguments for printf
    movl $'E', 4(%esp)
    movl %edi, 8(%esp)
    movl %edx, 12(%esp)
    movl %eax, 16(%esp)
    movl %ecx, 20(%esp)
    call printf                 # Call a C function

    leave                       # Restore the stack
    xor %eax, %eax              # Return 0;
    ret                         # Only valid when compiled with a compiler (GCC)

init:
    movl $0x4F, %eax
    movl $0x500, %ebx
    movl $0x1, %ecx
    movl $0x2, %edx
    ret
...