Скачать презентацию Лекция 10 а Основные подводные камни при программировании Скачать презентацию Лекция 10 а Основные подводные камни при программировании

Информатика_лек10a(замечания) .ppt

  • Количество слайдов: 18

Лекция 10 а Основные «подводные камни» при программировании на Ассемблере из 18 1 Лекция 10 а Основные «подводные камни» при программировании на Ассемблере из 18 1

Ошибки при делении 1. При выполнении операции деления на значения размером в двойное слово Ошибки при делении 1. При выполнении операции деления на значения размером в двойное слово (т. е. например, на содержимое регистра EBX ) следует помнить: делимое при этом находится в (EDX, EAX), т. е. старшая часть делимого в EDX, младшая часть в EAX. Это значит, что надо следить за содержимым EDX: если число маленькое (т. е. помещается в EAX), то регистр EDX следует обнулять до деления. Напомним, что после деления – целая часть частного находится в EAX, остаток при делении – в EDX. из 18 2

Пример с ошибкой при делении (деление на слово) ; пример к проблеме с DX Пример с ошибкой при делении (деление на слово) ; пример к проблеме с DX при делении на слово ; деление [a/b] [c 1/d] (целая часть при делении). 386. model flat, stdcall includelib kernel 32. lib Exit. Process proto : DWORD. data a dword 25 b dword 4 c 1 dword 7 d dword 10. code из 18 3

begin: mov eax, a mov ebx, b ; MOV e. DX, 0 ; вставляем begin: mov eax, a mov ebx, b ; MOV e. DX, 0 ; вставляем для устранения ошибок div ebx mov esi, eax mov eax, c 1 mov ebx, d ; MOV e. DX, 0 ; вставляем для устранения ошибок div ebx mov edi, eax invoke Exit. Process, 0 end begin из 18 4

Проверить пример в работе (pr_1. asm) из 18 5 Проверить пример в работе (pr_1. asm) из 18 5

Использование переменных 2. Если в программе используются переменные или массивы (описанные в сегменте данных), Использование переменных 2. Если в программе используются переменные или массивы (описанные в сегменте данных), то между их описанием (размером в байт – директивой BYTE, в слово – WORD, в двойное слово – DWORD) и их использованием должно быть строгое соответствие. А именно: - если переменная размером в байт (например, X byte ? ), то заносить в нее 16 -разрядный регистр нельзя, т. е. например, MOV X, BX – неправильно, т. к. регистр AX размером в слово. Но можно, например, MOV X, BH - если переменная размером в слово (например, Y word ? ), то задавать MOV Y, AX можно, а, например, MOV AH, Y нельзя из 18 6

Особенность работы с отрицательными числами 4. При умножении знаковых чисел (т. е. чисел возможно Особенность работы с отрицательными числами 4. При умножении знаковых чисел (т. е. чисел возможно и отрицательных) используется команда IMUL (вместо MUL – для беззнаковых) 5. При делении знаковых чисел (т. е. чисел возможно и отрицательных) используется команда IDIV (вместо DIV – для беззнаковых) 6. При просмотре регистров в отладчике следует помнить, что отрицательные числа представляются в дополнительном коде. Чтобы получить модуль такого числа, нужно его вычесть из 10000 H в 16 -ричной системе. Например, регистр EBX содержит FFFFFFE 7, тогда модуль этого отрицательного числа 10000 – FFFFFFE 7 = 19 (в 16 -ричной!). Иначе говоря, в EBX находится отрицательное число -19 H. из 18 7

; деление отрицательных чисел: b/y (рез в DI). 386. model flat, stdcall includelib kernel ; деление отрицательных чисел: b/y (рез в DI). 386. model flat, stdcall includelib kernel 32. lib Exit. Process proto : dword. data b dword -10 y dword -5. code begin: mov eax, b cmp eax, 0 JGE pol ; проверка на отрицательность делимого mov edx, 0 ffffh ; расширение его доп. кода jmp otr pol: mov edx, 0 ; если делимое положительно – занулить EDX otr: mov ebx, y IDIV ebx ; если DIV, но неверно делит mov edi, eax invoke Exit. Process, 0 из 18 end begin 8

Проверим пример в работе (pr_4. asm) из 18 9 Проверим пример в работе (pr_4. asm) из 18 9

Пример со вводом и выводом отрицательных чисел. 386. model flat, stdcall option casemap: none Пример со вводом и выводом отрицательных чисел. 386. model flat, stdcall option casemap: none include windows. include user 32. include kernel 32. includelib user 32. lib includelib kernel 32. lib BSIZE equ 128. data a DWORD ? b DWORD ? ifmt BYTE "a=%d b=%d ", 0 buf BYTE BSIZE dup(? ) msg. A BYTE "vvodi A (v konce probel i Enter)", 13, 10 msg. B BYTE "vvodi B (v konce probel i Enter)", 13, 10 stdout DWORD ? stdin DWORD ? c. Read DWORD ? c. Written DWORD ? . code start: invoke Get. Std. Handle, STD_OUTPUT_HANDLE mov stdout, eax invoke 18 из Get. Std. Handle, STD_INPUT_HANDLE 10 mov stdin, eax

; ввод A invoke Write. Console. A, stdout, ADDR msg. A, sizeof msg. A, ; ввод A invoke Write. Console. A, stdout, ADDR msg. A, sizeof msg. A, ADDR c. Written, 0 invoke Read. Console, stdin, ADDR buf, BSIZE, ADDR c. Read, NULL mov esi, offset buf ; в esi адрес начала строки buf ; преобразование строки из цифр в число ; проверка на ОТРИЦАТЕЛЬНОСТЬ cmp bl, 32 ; пробел – код 32 mov edi, 0 jz done mov bl, [esi] sub bl, 48 cmp bl, 45 ; 45 – код минуса mul ecx jnz pol add eax, ebx mov edi, 1 inc esi jmp next pol: done: mov ecx, 10 cmp edi, 0 mov ebx, 0 jz dal mov edx, 0 neg eax mov eax, 0 dal: mov a, eax next: . . . аналогично В и затем - вывод из 18 11 mov bl, [esi] ; получаем символ из строки

Проверим пример в работе (pr 2 -2 io). pas из 18 12 Проверим пример в работе (pr 2 -2 io). pas из 18 12

Сравнение знаковых чисел 7. При сравнении знаковых чисел нужно использовать иные команды перехода. В Сравнение знаковых чисел 7. При сравнении знаковых чисел нужно использовать иные команды перехода. В командах перехода вида Jxx вместо A (в случае «больше» ) пишем G, вместо B (в случае «меньше» ) пишем L. Например, если в случае AX> BX, нужно перейти на метку BOL, то: для беззнаковых для знаковых CMP AX, BX JA BOL JG BOL Или, если при BX<=CX, нужно перейти на метку MEN, то для беззнаковых для знаковых CMP AX, BX JBE MEN JLE MEN из 18 13

Использование стека 8. При использовании стека помещать туда следует командой: PUSH ЕAХ и восстанавливать Использование стека 8. При использовании стека помещать туда следует командой: PUSH ЕAХ и восстанавливать из него командой, например, POP ЕBX из 18 14

Стек, регистр ESP и регистр флагов 9. Регистр ESP не рекомендуется использовать в арифметических Стек, регистр ESP и регистр флагов 9. Регистр ESP не рекомендуется использовать в арифметических операциях, т. к. этот регистр используется для управления работой стека (в нем хранится адрес вершины стека). Иначе говоря, задание значения ESP может нарушить порядок работы программы, особенно при использовании стека. 10. Стек может использоваться для выяснения содержимого регистра флагов. Для этого есть команды: POPF – запись регистра флагов в стек PUSHF - чтение регистра флагов из стека из 18 15

Хитрости при работе в FAR • Перенести имя активного файла (на нем стоит курсор) Хитрости при работе в FAR • Перенести имя активного файла (на нем стоит курсор) в командную строку Ctrl+Enter • Вызвать в командную строку предыдущую команду Ctrl+E • Вызвать в командную строку последующую команду Ctrl+X из 18 16

Требования (согласно рейтинговой системе) • Для допуска к экзамену в семестре нужно сдать все Требования (согласно рейтинговой системе) • Для допуска к экзамену в семестре нужно сдать все задания в семестре (лаб. и сам. работы) • Баллы в семестре: – лекции (13 х 1 б) 13 баллов – сам. работы (3 х 5 б) 15 баллов – лаб. работы (7 х 6 б) 42 балла – Итого 70 баллов из 18 17

Об экзамене На экзамене 30 баллов (10 баллов за вопрос билета) ОБЩИЙ ИТОГ: 100 Об экзамене На экзамене 30 баллов (10 баллов за вопрос билета) ОБЩИЙ ИТОГ: 100 баллов • Для оценки «удовлетворительно» от 60 до 69 баллов • Для получения оценки «хорошо» от 70 до 89 баллов • Для получения отличной оценки – от 90 и более баллов. • Вопросы к экзамену можно посмотреть на CesirAOSKVN1_KURS|ex_vop • В билете будет : 1. вопрос по общему курсу информатики, 2. вопрос по ассемблеру 3. задание на системы счисления или арифметические операции в двоичной системе счисления из 18 18