Здравствуйте! Я написал вот такую прогу: .model small .data Y db ? T db 10 B db 5 .code begin: mov ax, @data mov ds, ax mov al, T mul B aam or ah, 30h or al, 30h mov Y, ah mov Y+1, al mov Y+2, 24h mov ah, 09h lea dx, Y int 21h mov ah, 4ch int 21h end begin В этой проге число 10 умножается на 5 и результат 50 с помощью символьной коррекции выводится на экран. А если у меня при умножении получается 3-х разрядное число, например, 500 или вообще 100000, то как тогда его вывести на экран? (самый простой и понятный для новичка способ) Я пробовал, но у меня лезут на экран символы двоеточия. Заранее спасибо!
ну так посмотри примеры процедур из пакета MASM'а, там функции типа dwtoa (DWORD to ASCII), переводят число в строку. А строку выводишь на экран средствами ОС. Код (Text): ;поддерживает знак pecreg10 proc chislo:DWORD, mem:DWORD pushad mov edi, [mem] mov eax, [chislo] mov PW [edi], "0" test eax,eax jz @@kon jns @@pos mov PW [edi],'-' neg eax inc edi @@pos: xor ecx, ecx mov ebx, 10 @@1: inc ecx xor edx, edx div ebx push edx CP eax, 0, NZ, @@1 @@2: pop eax add eax, "0" mov [edi], al inc edi dnz ecx, @@2 dec edi @@kon: inc edi mov [pecreg_kon], edi mov PB [edi], 0 stc popad ret pecreg10 endp PS: CP и dnz макросы.
IPKILLER AAM предназначена для работы с неупакованными BCD-числами, у которых в каждом байте записана одна десятичная цифра от 0 до 9. Она просто делит число в AL на 10 и записывает целую часть в AH, а остаток от деления в AL. Поэтому в твоем коде будут правильно выводиться только результаты <= 99 (9 в AH и 9 в AL), а вот уже для 100 получится AH=10 и AL=0, что при переводе в строку даст ':0'. Для значений < 256 можно просто добавить еще одну AAM: mov al,ah + aam. Но для для больших чисел лучше плюнуть на эту AAM и делать преобразование самому через деление на 10 примерно так как предлагает yureckor (но он как всегда все усложняет своими макросами Суть простая: задаешь число байт под строку с запасом например Y db 16 dup(?), грузишь в dx указатель на последний символ Y+16. Затем делишь число в ах(eax) на 10, получаешь в dl остаток, прибавляешь к нему 30h - получаешь код символа, делаешь dec dx и пишешь символ в [dx]. Повторяешь пока число в ax(eax) не станет = 0. В итоге в конце dx у тебя указывает на старшую цифру в строке - грузишь ah и делаешь свой int 21h
А если я число ввожу с клавиатуры и оно соответственно заносится в буфер, например, buf , то как тогда быть. Ведь число должно находиться в AX. Его как-то нужно скопировать из buf в регистр AX, чтобы дальше производить деление содержимого AX на 10 и т.д.... Я пробовал просто mov ax, buf, но это не действует.
IPKILLER тогда тебе нужно процедуру перевода текста в число. См. опять тот же масм Код (Text): a2dw proc uses ecx edi edx esi String:DWORD ;---------------------------------------- ; Convert decimal string into dword value ; return value in eax ;---------------------------------------- xor ecx, ecx mov edi, String invoke lstrlen, String .while eax != 0 xor edx, edx mov dl, byte ptr [edi] sub dl, "0" ; subtrack each digit with "0" to convert it to hex value mov esi, eax dec esi push eax mov eax, edx push ebx mov ebx, 10 .while esi > 0 mul ebx dec esi .endw pop ebx add ecx, eax pop eax inc edi dec eax .endw mov eax, ecx ret a2dw endp
yureckor Ты где такую реализацию откопал 8( См. atodw.asm и atol.asm в m32lib Вроде длину строки никогда специально не ищут (код сам вываливается если не цифра) и умножение всегда делают через lea, а у тебя еще и пуши\попы какие-то... Как советуют отцы: "учите матчасть"