Почему то при использовании таблицы векторов прерываний код ассемблируется, но при запуске появляется окно с ошибкой. вот код, сассемблируйте и посмотрите что не так пожалста: Код (Text): cseg segment use16 org 100h begin: jmp init ob proc cmp ah,9 je ok jmp dword ptr cs:[vect] ok: push ds push dx push cs pop ds mov dx,offset my pushf call dword ptr cs:[vect] pop dx pop ds iret vect dd ? my db 'yahooo!$' ob endp init: ;mov ah,35h ;mov al,21h ;int 21h xor ax,ax mov es,ax mov bx,es:[21h*4] mov es,es:[21*4+2] mov word ptr vect,bx mov word ptr vect+2,es mov ax,2521h mov dx,offset ob int 21h mov dx,offset init int 27h cseg ends end begin
может надо Код (Text): call far dword ptr cs:[vect] Код (Text): jmp far dword ptr cs:[vect] кроме того, кто после call будет делать popf
Ещё один вопрос: что означает ошибка:"unresolved external symbol _ShellExecuteA@24". Ассемблирую такой код(Зубков): Код (Text): .486 .model flat,stdcall option casemap:none include \masm32\include\shell32.inc include \masm32\include\kernel32.inc .data URL db 'http://www.lionking.org/~cubbi/',0 .code main: invoke ShellExecute,0,0, addr URL,0,0,0 invoke ExitProcess,0 end main подобная ошибка у меня возникает очень часто. Что не так?
Это значит, что внешний символ (функция), который используется в программе не найден в процессе линкования. Чтобы все заработало нужно подключить библиотеку, содержащую вызываемую функцию.
rei3er Вы какой вызов имеете в виду? При входе в нашу obproc в стэке сохранены флаги и дальний адрес возврата. Если вызывается jmp dword ptr cs:[vect], то стэк не меняется, и iret оригинального обработчика корректно его очистит. Если же управление доходит до pushf/call dword ptr cs:[vect], то в стэке сохраняются вторые флаги и дальний адрес возврата на команду после call, которые будут очищены iret оригинального обработчика, а первые флаги с адресом очистятся нашим iret. Чi я вопрос не понял?
Товарищи у меня опять проблема, не могу чё то вывести массив на экран, выводится што то не то. Вот код: Код (Text): .model small .386 .stack 100h .data mes db "po umolchaniu dick C:$" mes1 db "po umolchniu stoit drugoi disk (ne c:)$" ha dw 0FFFFh mas dw 4 dup(?) .data? wax dd ? way dd ? len dw ? .code sc proc mov ah,9 int 21h ret sc endp main: mov ax,@data mov ds,ax mov ah,19h int 21h jc exit cmp al,02 ; 02 - "C:\" jne pul mov dx,offset mes call sc mov ah,36h mov dl,al int 21h cmp ax,ha ; если ax=0FFFFh , то выходим jc exit ;если нет, то в ; ax - число секторов в одном кластере ; bx - количество свободных кластеров ; cx - размер сектора в байтах ; dx - общее число кластеров на диске mov esi,0 mov mas[0],ax mov mas[2],bx mov mas[4],cx mov mas[8],dx mov esi,0 mov cx,4 tig: ;выводим на экран массив mas mov ah,2 mov dx,mas[esi*2] add dl,30h int 21h inc esi loop tig mul bx ; теперь в bx находится "ax*bx" mov word ptr wax,ax mov word ptr wax+2,dx mov eax,wax mov word ptr way,cx mul way jmp exit pul: mov dx,offset mes1 call sc exit: mov ah,10h int 16h mov ax,4c00h int 21h end main
А я думаю, массив выводится, но тебе видимо нужно, чтобы его элементы вывелись в виде десятичных чисел. Тогда нужно их преобразовать. Посмотри здесь http://www.wasm.ru/forum/viewtopic.php?id=20206
giskar На мой пьяный взгляд код неправильный. По порядку. После отработки Код (Text): call sc al содержит код последнего выведенного символа, т.е. 24h. Вот этой командой Код (Text): mov dl,al как я понимаю, автор задумывал поместить в dl значение 02h, а помещается 24h. Т.е. последующий вызов int 21h определяет кол-во свободного места на неопределенном диске(24h), разумеется, если на машине автора их не такое же количество. Далее, вот эта команда Код (Text): cmp ax,ha при значении переменной ha=0FFFFh, будет выставлять флаг CF всегда(!), кроме случая, когда ax также равен 0FFFFh. Т.е. коментарий автора абсолютно не верен, переход Код (Text): jc exit срабатывает всегда, когда ax != 0FFFFh. Ик!
mathio : Ещё раз: cmp ax,0FFFFh ; ax=0FFFFh ??? jc exit ; Если равно, то CF=1. Переходим на метку exit ........ Или я чего то не понимаю?????? Ты хочешь сказать, что ну нужно поставить jne ??
Vov4ick меня ведь тут интересует именно CF, а не равенство или не равенство ax и FFFFh. Вот код с вашей процедурой, я так понимаю, что в ax у меня теперь число секторов в кластере, по программа выдаёт вместо числа какие то строки: Код (Text): .model small .stack 256 .data f dd 0 .code num proc ; AX - число ES:DI-куда писать ответ std ; Запись справа налево для STOSB mov bx,10 ; Делитель diving: xor dx,dx ; Чтобы избежать переполнения при делении div bx ; AX=частное DX=остаток ; DX=DL % 10 push ax mov ax,dx add al,'0' stosb ; AX -> [ES:DI] ; DEC DI pop ax or ax,ax ; Частное было равно нулю? jnz diving ; Нет-продолжить цикл ret num endp main: mov ax,@data mov ds,ax mov ah,19h int 21h mov dl,al mov ah,36h int 21h ;теперь в ax число секторов в одном кластере call num mov dx,es:[di] mov ah,9 int 21h mov dx,10h int 16h mov ax,4c00h int 21h end main
JC -- Jump if Carry, переход осуществляется если установлен флаг CF, т.е. CF==1 JE -- Jump if Equal, переход осуществляется если установлен флаг ZF, т.е. ZF==1 Флаг CF после выполнения следующей инструкции: Код (Text): cmp ax, ha ; при word ptr [ha] == 0FFFFh jc exit будет устанавливаться ВСЕГДА, кроме случая, когда AX равен 0FFFFh, т.к. НЕТ ТАКОГО WORD КОТОРЫЙ ПО МОДУЛЮ БОЛЬШЕ 0FFFFh. Т.е. иными словами переход на метку EXIT будет осуществляться всегда, кроме случая, когда AX равен 0FFFFh(в этом случае будет установлен флаг ZF, а CF будет сброшен). giskar андерстенд?
) mathio , спасибо, теперь понятно. И самое главное: я понял, что лучше из кода эту проверку на ошибку вобще убрать)))
Хочу вывести на экран число 137. В коде преобразую его в строку, потом пытаюсь вывести эту строку на экран, выводится абра-кадабра. Объясните пожалуста что не так. Код (Text): .model small .stack 100h .data mesa db "ax ne raven nulu$" mesa1 db "ax raven nulu$" .code num proc ; AX - число ES:DI-куда писать ответ std ; Запись справа налево для STOSB mov bx,10 ; Делитель diving: xor dx,dx ; Чтобы избежать переполнения при делении div bx ; AX=частное DX=остаток ; DX=DL % 10 push ax mov ax,dx add al,'0' stosb ; AX -> [ES:DI] ; DEC DI pop ax or ax,ax ; Частное было равно нулю? jnz diving ; Нет-продолжить цикл ret num endp main: mov ax,@data mov ds,ax mov ax,137 call num mov ah,9 mov dx,es:[di] int 21h mov ax,4c00h int 21h end main