|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Программа вычисления квадратного корняTITLE SQR.ASM; Извлечение корня квадратного stacksg segment para stack 'Stack' ; назначить область памяти для стека dw 32 dup(32) stacksg ends datasg segment para 'Data' ; определить данные vv db 'введите аргумент n (до 64 тыс.) $' viv db 10,13,'значение корня = $' sr db 3 dup(0) db 13,10,'$' buf db 5,0,0,0,0,0,0,0 n dw? e dw 1 a dw? b dw? val dw? two dw 2 datasg ends codesg segment para 'Code' ; программный сегмент assume cs:codesg,ds:datasg,ss:stacksg begin proc far push ds sub ax,ax push ax mov ax,datasg mov ds,ax mov ah, 9 mov dx,offset vv int 21h mov ah, 0ah mov dx,offset buf int 21h call str2bin mov dx,0 mov ax,n inc ax div two sub dx,dx mov a,ax iter: mov ax,n div a add ax,a mov dx,0 div two sub dx,dx mov b,ax sub ax,a cmp ax,e jbe met mov ax,b mov a,ax jmp iter met: mov ah,9 mov dx,offset viv int 21h call bin2str mov ah,9 mov dx,si int 21h ret bin2str proc near mov cx,10 mov si,offset sr+2 mov ax,b m1: sub dx,dx div cx or dl,30h mov [si],dl dec si cmp ax,0 jne m1 ret bin2str endp str2bin proc near mov di,1 mov cx,0ah mov si,offset buf+1 sub bh,bh mov bl,[buf+1] m2: mov al,[si+bx] and ax,0fh mul di add n,ax mov ax,di mul cx mov di,ax dec bx jnz m2 ret str2bin endp begin endp codesg ends end begin
Основные сведения о листинге программы Листинг (распечатка) программы на ассемблере используется как при создании ассемблерных программ, так и в качестве источника информации для квалифицированных программистов при отладке и оптимизации программ, написанных на языках высокого уровня. Ни один другой компилятор и его листинг не дает программисту такого количества полезной технической информации, как ассемблер. Ведь одна из основных целей использования языков высокого уровня — как раз желание избежать не очень существенных технических подробностей. Но если программист хочет разобраться с подробностями созданной программы, то большинство отладчиков могут распечатать объектный эквивалент созданной программы на языке ассемблера. Эти распечатки позволяют программисту оценить качество программы и являются весьма полезными при ее оптимизации. Листинг состоит из 2-х частей: из листинга программы и сводной информации о сегментах и идентификаторах программы. Листинг программы имеет три столбца, в которых отображаются команды исходной ассемблерной программы и соответствующие им объектные коды: l левый столбец содержит шестнадцатеричное значение смещения адреса команды (счетчик команд — IP) от начала сегмента; l правый столбец содержит операторы и псевдооператоры ассемблера (команды и директивы программы); l в средней части размещены коды: для сегмента стека и сегмента данных — числа, запоминаемые в соответствующих ячейках памяти; для сегмента команд это коды машинных команд МП, соответствующих операторам ассемблера. Сводная информация о сегментах и идентификаторах дает подробную их характеристику. В конце листинга приводятся сообщения об ошибках в программе. Листинг программы SQR.ASM. Microsoft (R) Macro Assembler Version 5.10 3/19/04 23:44:19 SQR.ASM; Извлечение корня квадратного TITLE SQR.asm; Извлечение корня квадратного 0000 stacksg segment para stack 'Stack' ; назначить область памяти для стека 0000 0020 [ dw 32 dup(32) 0020 ] 0040 stacksg ends 0000 datasg segment para 'Data' ; определить данные 0000 A2 A2 A5 A4 A8 E2 vv db 'введите аргумент n (до 64 тыс.)$' A5 20 A0 E0 A3 E3 AC A5 AD E2 20 6E 20 28 A4 AE 20 36 34 20 E2 EB E1 2E 29 20 24 0021 0A 0D A7 AD A0 E7 viv db 10,13,'значение корня = $' A5 AD A8 A5 20 AA AE E0 AD EF 20 20 3D 20 24 0036 0003[ sr db 3 dup(0) ] 003A 0D 0A 24 db 13,10,'$' 003D 05 00 00 00 00 00 buf db 5,0,0,0,0,0,0,0 00 00 0045 0000 n dw? 0047 0001 e dw 1 0049 0000 a dw? 004B 0000 b dw? 004D 0000 val dw? 004F 0002 two dw 2 0051 datasg ends 0000 codesg segment para 'Code' ; программный сегмент assume cs:codesg,ds:datasg,ss:stacksg 0000 begin proc far 0000 1E push ds 0001 2B C0 sub ax,ax 0003 50 push ax 0004 B8 ---- R mov ax,datasg 0007 8E D8 mov ds,ax 0009 B4 09 mov ah, 9 000B BA 0000 R mov dx,offset vv 000E CD 21 int 21h 0010 B4 0A mov ah, 0ah 0012 BA 003D R mov dx,offset buf 0015 CD 21 int 21h 0017 E8 007D R call str2bin 001A BA 0000 mov dx,0 001D A1 0045 R mov ax,n 0020 40 inc ax 0021 F7 36 004F R div two 0025 2B D2 sub dx,dx 0027 A3 0049 R mov a,ax 002A A1 0045 R iter: mov ax,n 002D F7 36 0049 R div a 0031 03 06 0049 R add ax,a 0035 BA 0000 mov dx,0 0038 F7 36 004F R div two 003C 2B D2 sub dx,dx 003E A3 004B R mov b,ax 0041 2B 06 0049 R sub ax,a 0045 3B 06 0047 R cmp ax,e 0049 76 08 jbe met 004B A1 004B R mov ax,b 004E A3 0049 R mov a,ax 0051 EB D7 jmp iter 0053 B4 09 met: mov ah,9 0055 BA 0021 R mov dx,offset viv 0058 CD 21 int 21h 005A E8 0064 R call bin2str 005D B4 09 mov ah,9 005F 8B D6 mov dx,si 0061 CD 21 int 21h 0063 CB ret 0064 bin2str proc near 0064 B9 000A mov cx,10 0067 BE 003A R mov si,offset sr+2 006A A1 004B R mov ax,b 006D 2B D2 m1: sub dx,dx 006F F7 F1 div cx 0071 80 CA 30 or dl,30h 0074 88 14 mov [si],dl 0076 4E dec si 0077 3D 0000 cmp ax,0 007A 75 F1 jne m1 007C C3 ret 007D bin2str endp 007D str2bin proc near 007D BF 0001 mov di,1 0080 B9 000A mov cx,0ah 0083 BE 003E R mov si,offset buf+1 0086 2A FF sub bh,bh 0088 8A 1E 003E R mov bl,[buf+1] 008C 8A 00 m2: mov al,[si+bx] 008E 25 000F and ax,0fh 0091 F7 E7 mul di 0093 01 06 0045 R add n,ax 0097 8B C7 mov ax,di 0099 F7 E1 mul cx 009B 8B F8 mov di,ax 009D 4B dec bx 009E 75 EC jnz m2 00A0 C3 ret 00A1 str2bin endp 00A1 begin endp 00A1 codesg ends end begin Segments and Groups: N a m e Length Align Combine Class CODESG......... 00A1 PARA NONE 'CODE' DATASG......... 0051 PARA NONE 'DATA' STACKSG........ 0040 PARA STACK 'STACK' Symbols: N a m e Type Value Attr A........... L WORD 0049 DATASG B........... L WORD 004B DATASG BEGIN......... F PROC 0000 CODESG Length = 00A1 BIN2STR........ N PROC 0064 CODESG Length = 0019 BUF.......... L BYTE 003D DATASG E........... L WORD 0047 DATASG ITER.......... L NEAR 002A CODESG M1........... L NEAR 006D CODESG M2........... L NEAR 008C CODESG MET.......... L NEAR 0053 CODESG N........... L WORD 0045 DATASG SR........... L BYTE 0036 DATASG Length = 0004 STR2BIN........ N PROC 007D CODESG Length = 0024 TWO.......... L WORD 004F DATASG VAL.......... L WORD 004D DATASG VIV.......... L BYTE 0021 DATASG VV........... L BYTE 0000 DATASG @CPU.......... TEXT 0101h @FILENAME....... TEXT sqr3 @VERSION........ TEXT 510 95 Source Lines 95 Total Lines 28 Symbols 47690 + 382785 Bytes symbol space free 0 Warning Errors 0 Severe Errors
При ассемблировании и редактировании связей могут быть получены еще два листинга с дополнительной информацией: l карта перекрестных ссылок указывает номер строки программы, в которой определен каждый идентификатор, и номер тех строк, в которых имеются на него ссылки (этот листинг можно получить, если на запрос ассемблера о перекрестных ссылках (Cross references) ввести имя файла prog (а не Nul.CRF — по умолчанию), при этом в основном листинге программы добавится столбец с номерами строк); l карта распределения памяти содержит подробные сведения о сегментах всех блоков программы, объединяемых редактором связей LINK (листинг содержится в файле prog.map). Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.) |