А если просто вычесть и знак результата проверить?
MOV A,N1
MOV B,N2
SUB B
JM less
А если просто вычесть и знак результата проверить?
MOV A,N1
MOV B,N2
SUB B
JM less
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Ааа... спать надо больше. Точно ведь. А мне лень даже в яндекс вбить слово.
---------- Post added at 00:39 ---------- Previous post was at 00:33 ----------
У меня получилось, что myFunction(1, myFuction(2, 3)) некорректно работает
mvi a, 1
sta myFunction_paramA
mvi a, 2
sta myFunction_paramA
mvi a, 3
call myFunction
call myFunction
Но это можно обойти
---------- Post added at 00:40 ---------- Previous post was at 00:39 ----------
В среду дам первую версию. Эта еще сырая очень.
2100 строк 66 Кб
И всё-таки по причинам реентерабельности, стоит подумать о размещении локальных переменных на стеке. Дело здесь не только в interrupt функциях, для которыз кстати надо ещё PUSHALL делать. Просто, если компилятор будет использоваться для написания оконных интерфейсов, почти неизбежны локальные стеки и переключения контекстов.
Возможно, Вы подумаете о чём-нибудь типа
#pragma recursion:ON/OFF
Также пожелание поддерживать несколько calling conventions, по крайей мере extern "C" / _stdcall, _pascal, _memblock (это-Ваш вариант) и _fast (передача до 2х параметров в регистрах)
Сделаю рекурсию. Добавлю модификаторы _static, _stack. Пока не до этого, пока у меня даже комментарии не поддерживаются.
---------- Post added at 01:22 ---------- Previous post was at 00:52 ----------
Прикольно. Написал
x=32; y=15;
while(1) {
i=getch();
print(x, y, "+");
if(i==0x19) { if(y>0) --y; } else
if(i==0x08) { if(x>0) --x; } else
if(i==0x1A) { if(y<24) ++y; } else
if(i==0x18) { if(x<63) ++x; }
print(x, y, "O");
}
сижу рисую.Теперь жизнь станет проще, а программы круче.
---------- Post added at 01:36 ---------- Previous post was at 01:22 ----------
Код:Программа struct File { ushort some1, size; uchar name[11]; uchar some2; }; File files[24]; void main() { register uchar i; File* f; clrscr(); for(f=files, i=0; i<24; ++i, ++f) itoa(f->name, i); for(i=0; i<16; ++i) print(0, i, files[i].name); while(1); } files ds 384 main_f ds 2 main: push bc ; 49 clrscr(); call clrscr ; 51 for(f=files, i=0; i<24; ++i, ++f) ld hl, files ld (main_f), hl ld b, 0 l12: ld a, b cp 24 jp nc, l13 ; 52 atoi(f->name, i); ld hl, (main_f) inc hl inc hl inc hl inc hl ld (atoi_str1), hl ld l, b ld h, 0 call atoi inc b ld hl, (main_f) ld de, 16 add hl, de ld (main_f), hl jp l12 l13: ; 54 for(i=0; i<16; ++i) ld b, 0 l15: ld a, b cp 16 jp nc, l16 ; 55 print(0, i, files[i].name); xor a ld (print_x), a ld a, b ld (print_y), a ld l, b ld h, 0 add hl, hl add hl, hl add hl, hl add hl, hl ld de, files add hl, de inc hl inc hl inc hl inc hl call print inc b jp l15 l16: ; 57 while(1); l18: jp l18 l19: l11: pop bc ret
Последний раз редактировалось vinxru; 15.09.2012 в 03:25.
Если сравнивать только положительные или только отрицательные - то да.
Например.
10-8 = 2. бит 7 нулевой. 10>8
(-1)-(-2)=255-254=1. бит 7 нулевой. -1>-2
А вот если одни с другими...
127 - (-2) = 127 - 254 = -127 = 0х81 бит 7 ненулевой. 127<-2. Но это неверно!
Тут надо не только знак учитывать, но и флаг переполнения. И если есть переполнение - реверсировать результат.
MOV A,N1
MOV B,N2
SUB B
MOV B,A
RRA
XOR B
JM less
В коде не совсем уверен, сейчас несколько нетрезв.
Последний раз редактировалось predatoralpha; 15.09.2012 в 02:10.
Возможно пригодится - сравнение 16 битных знаковых чисел
Чуть измененный вариант из книгиКод:;DE и HL - знаковые 16 битные целые ;Портит A и B CmpDEHL: mov a,d xra h jm DiffSigns mov a,e sub l mov b,a mov a,d sbb h rc ;DE<HL (CY=1) ora b ret ;или DE>HL (CY=0;Z=0) или DE=HL (CY=0;Z=1) DiffSigns: xra h rp ;DE>HL (CY=0;Z=0) stc ret ;DE<HL (CY=1)
Григорьев В.Л. Программное обеспечение микропроцессорных систем. М.: Энергоатомиздат, 1983 (с. 173-174)
Последний раз редактировалось ivagor; 15.09.2012 в 08:04.
Если автор топика задумал написть свой компилятор Си под ВМ80, то может ему пригодится книга "Компилятор Си для микроЭВМ" Д.Хендрикс. В ней описывается Смолл-Си.
Вот ссылки из инета.
http://net.lg.ua/~cray/compilers/jhc.djvu
http://net.lg.ua/~cray/compilers/smallc21.rar
8-битное сравнение из 16-битного варианта вроде тоже неплохо получается:
Код:;A и E - знаковые 8 битные целые ;Кроме флагов ничего не портит CmpAE: xra e jm DiffSigns xra e cmp e ret ;A<E (CY=1) или A>E (CY=0;Z=0) или A=E (CY=0;Z=1) DiffSigns: xra e rp ;A>E (CY=0;Z=0) stc ret ;A<E (CY=1)
Мой вариант сравнения с инверсией флага переноса неверен.
vinxru, используй свою версию с +80. Похоже, на 7-й бит нельзя опираться.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)