А если просто вычесть и знак результата проверить?
MOV A,N1
MOV B,N2
SUB B
JM less
Вид для печати
А если просто вычесть и знак результата проверить?
MOV A,N1
MOV B,N2
SUB B
JM less
Ааа... спать надо больше. Точно ведь. А мне лень даже в яндекс вбить слово.
---------- 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
Если сравнивать только положительные или только отрицательные - то да.
Например.
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
В коде не совсем уверен, сейчас несколько нетрезв.
Возможно пригодится - сравнение 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)
Если автор топика задумал написть свой компилятор Си под ВМ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-й бит нельзя опираться.