polmon: stop using es and praying
This commit is contained in:
46
polmon.cc
46
polmon.cc
@@ -74,7 +74,7 @@ void puts(const char* s) {
|
||||
// arguments on the stack in reverse order
|
||||
extern "C" uint16_t Jump(uint16_t addr, int nargs);
|
||||
asm (
|
||||
".section .text \n"
|
||||
".section .text.Jump \n"
|
||||
"Jump: \n"
|
||||
" push %bx \n"
|
||||
" push %si \n"
|
||||
@@ -152,30 +152,25 @@ void WriteUint16(uint16_t a) {
|
||||
WriteUint8(a & 0xff);
|
||||
}
|
||||
|
||||
void __set_es__(uint16_t es) {
|
||||
asm volatile (
|
||||
"mov %0, %%es"
|
||||
:: "r" (es)
|
||||
: "es"
|
||||
);
|
||||
}
|
||||
|
||||
uint8_t __get_es_u8__(uint16_t addr) {
|
||||
register uint16_t ad asm ("di") = addr;
|
||||
uint8_t ret;
|
||||
asm volatile (
|
||||
"movb %%es:(%1), %0"
|
||||
uint8_t __get_far_u8__(uint16_t addr, uint16_t seg) {
|
||||
register uint16_t ad asm ("si") = addr;
|
||||
register uint16_t sg asm ("ds") = seg;
|
||||
register uint8_t ret asm ("al");
|
||||
asm (
|
||||
"lodsb \n\t"
|
||||
: "=r" (ret)
|
||||
: "r" (ad)
|
||||
: "r" (ad), "r" (sg)
|
||||
);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void __set_es_u8__(uint16_t addr, uint8_t val) {
|
||||
void __set_far_u8__(uint16_t addr, uint16_t seg, uint8_t val) {
|
||||
register uint16_t ad asm ("di") = addr;
|
||||
asm volatile (
|
||||
"movb %0, %%es:(%1)"
|
||||
:: "ri" (val), "rmi" (ad)
|
||||
register uint16_t sg asm ("es") = seg;
|
||||
register uint8_t v asm ("al") = val;
|
||||
asm (
|
||||
"stosb \n\t"
|
||||
:: "r" (sg), "r" (ad), "r" (v)
|
||||
: "memory"
|
||||
);
|
||||
}
|
||||
@@ -190,17 +185,17 @@ inline static void __basic__() {
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
void Dump(uint16_t addr, int count) {
|
||||
void Dump(uint16_t addr, uint16_t seg, int count) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
putc(' ');
|
||||
uint8_t d = __get_es_u8__(addr + i);
|
||||
uint8_t d = __get_far_u8__(addr + i, seg);
|
||||
WriteUint8(d);
|
||||
}
|
||||
#if ASCIIDUMP
|
||||
putc(' ');
|
||||
putc(' ');
|
||||
for (int i = 0; i < count; i++) {
|
||||
uint8_t d = __get_es_u8__(addr + i);
|
||||
uint8_t d = __get_far_u8__(addr + i, seg);
|
||||
if (d > 31 && d < 127) {
|
||||
putc(d);
|
||||
} else {
|
||||
@@ -216,11 +211,10 @@ void DumpHex(uint16_t addr, uint16_t seg) {
|
||||
putc('[');
|
||||
WriteUint16(seg);
|
||||
putc(':');
|
||||
__set_es__(seg);
|
||||
WriteUint16(addr);
|
||||
putc(']');
|
||||
putc(':');
|
||||
Dump(addr, kDumpSize);
|
||||
Dump(addr, seg, kDumpSize);
|
||||
putc('\r');
|
||||
putc('\n');
|
||||
}
|
||||
@@ -276,7 +270,6 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) {
|
||||
nargs++;
|
||||
ptr += 4;
|
||||
}
|
||||
__set_es__(cur_seg);
|
||||
uint16_t ret = Jump(cur_addr, nargs);
|
||||
asm volatile (
|
||||
"shl %0 \n\t"
|
||||
@@ -306,8 +299,7 @@ bool ParseCommand(const char* buf, uint16_t& cur_addr, uint16_t& cur_seg) {
|
||||
continue;
|
||||
}
|
||||
uint8_t d = ReadUint8(ptr);
|
||||
__set_es__(cur_seg);
|
||||
__set_es_u8__(addr, d);
|
||||
__set_far_u8__(addr, cur_seg, d);
|
||||
addr++;
|
||||
ptr += 2;
|
||||
}
|
||||
|
Reference in New Issue
Block a user