.model tiny .code org 100h start: mov ax,0003h int 10h mov dx,offset message mov ah,09h int 21h mov dx,offset bukva mov ah,0Ah int 21h xor di,di xor ax,ax mov al,byte ptr buf[di] ; cmp al,10 ; sbb al,69h n ; das int 29h ret message db "Enter number: $" bukva db 6 buf: end start что такое byte ptr? по какому принципу идет чтение из буфера? почему когда я ввожу 1 символ..прога мне выдает символ 1 из таблицы ASCII вводу 2 символа, выводит второй...три-третий....и так далее пр. Enter number: 123 -- На выходе 3 символ таблицы ASCII причем числа не имеют ни какого значения...как это понять? я думал что он будет действовать как массив...доставая по очереди каждый символ... в данном случае 1 или 3(не знаю ка ка последовательность) --------------------------------------------------- ; cmp al,10 ; sbb al,69h n ; das какие именно действия происходят в этих 3-х строках
ptr - pointer byte ptr - указатель на байт mov al, byte ptr [di] - загнать в al (младшую часть ax) байт, находящийся по адресу di. теперь смотри на свою программу. Есть буффер, предположим SomeBuf db "ABCD....Z" соответственно символ А будет находится по адресу [SomeBuf+0], B по адресу [SomeBuf+1] и т.д. Условно это можно записать как [SomeBuf+di], где di - индекс символа, или смещение символа от начала буффера.
спасибо большое многое прояснил...первые 4 дня в ассемблере - это путаница... если бы не опыт в С++, я бы вообще поник..... на вторую часть вопроса...еще бы ответ получить
Скачай себе справочник по асм-коммандам. Вот я те залил на рапиду... http://rapidshare.com/files/48695160/asm.chm.html И так. cmp - комманда сравнения тут без комменариев. SBB Целочисленное вычитание с займом Код (Text): Команда sbb вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде sbb операнд__1, операнд_2 то ее действие можно условно изобразить следующим образом: операнд_1 - операнд_2 - CF -> операнд_1 В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда sbb обычно используется для вычитания 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, PF и CF. Пример 1 mov AX,76A5h sbb AX,76A3h ;AX=1, если CF был = 1 ;AX=2, если CF был = 0 Пример 2 ; В полях данных: numlow dw 000Ah ;Младшая часть вычитаемого numhigh dw 0001h ;Старшая часть вычитаемого ;Число 1000Ah=65546 ;В программном сегменте: mov AX, 0 ;Младшая часть уменьшаемого mov DX,0002 ;Старшая часть уменьшаемого ;Число 20000h=131072 sub AX, numlow ;Вычитание младших частей. ;AX=FFF6h, CF=1 sbb DX,numhigh ;Вычитание старших частей с ;займом. ;DX:AX=0000:FFF6h=65526 386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример ;В полях данных: nlow dd 0Ch ;Младшая часть вычитаемого nhi dd 40000000h ;Старшая часть вычитаемого ;Число 400000000000000Ch ;В программном сегменте: mov EAX,0Bh ;Младшая часть уменьшаемого mov EBX,60000000h ;Старшая часть уменьшаемого ;Число 600000000000000Bh sub EAX,nlow ;Вычитание младших частей. ;EAX=FFFFFFFFh, CF=1 sbb EBX,nhi ;Вычитание старших частей с ;займом. EBX=lFFFFFFFh ;Разность IFFFFFFFFFFFFFFFh ====================================================================== DAS Десятичная коррекция в регистре AL после вычитания Код (Text): Команда das корректирует результат вычитания в регистре AL двух упакованных двоично-десятичных (BCD) чисел (по одной цифре в каждом полубайте), чтобы получить пару правильных упакованных десятичных цифр. Команда используется вслед за операцией вычитания упакованных двоично-десятичных чисел. Если для вычитания требовался заем, устанавливается флаг CF. Команда воздействует на флаги SF, ZF, AF, PF и CF. Пример 1 mov AL,55h ;Упакованное BCD 55 sub AL,19h ;После вычитания AL=3Ch das ;AL=36h, т.е. упакованное BCD 36 Пример 2 mov AL,55h ;Упакованное BCD 55 sub AL,15h ;После вычитания AL=40h das ;AL=40h, т.е. упакованное ;BCD 40 (в данном случае ;команда das ничего не делает) DEC Декремент (уменьшение на 1) Команда dec вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF. Пример 1 mov AX,0FFFFh dec AX ;AX=FFFEh Пример 2 mov CX,0 dec CX ;CX=FFFFh Пример 3 mov CX,3500h dec CL ;CX=35FFh Пример 4 ; В полях данных mem dw 68 ;B программном сегменте dec mem mem=67 386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Пример mov EAX, 0 dec EAX ;EAX=FFFFFFFFh
rubic_ какие именно действия происходят в этих 3-х строках Преобразование hex-цифры в AL в ASCII-код. Вход: AL - hex-цифра (00h - 0Fh). Выход: AL - ASCII-код символа.
это то я понял...как именно она преобразует nitrotoluol -спасибо за справочник...очень удобный..что значит упакованное(DAS команда)
упакованное это значит что например число 23 будет представлено в двоичном виде вот так: 0010 0011 2 3 формат шизнутый. вроде делали его для удобства но я например им сроду не пользовался. Хотя испытывал эстетическое удовольствие от использование этой самой команды десятичной коррекции. Помнится была она еще на процессорах Z80 . сам формат предназначен для проведения арифметических операций непосредственно в десятично-двоичном формате. Чтобы не приходилось париться с переводом из двоичной в десятичную и обратно.