| 86系でセグメント内絶対アドレスへ跳ぶ かかっくん 2026年8月15日(土) 17:11 |
修正 |
8C C8 ; mov AX,CS A3 ** ** ; mov [$+7],AX EA ** ** 00 00 ; jmp 0:addr 叉わ 9A ** ** 00 00 ; call 0:addr ; ROM等自己書換禁止の場合フカ、callの場合retfで還る
mov AX,CS; mov [$+7],AXで0:addrの0がCSの内容で上書きされ枡 他に 0E ; push CS 8F 06 ** ** ; pop Word ptr [$+7] EA | 9A ** ** 00 00 ; jmp | call far
push memやpop memと云うのも有馬す
|
| 自己書き換え リウ 2026年8月15日(土) 22:18 |
修正 |
ジャンプテーブルを作って参照する方法ばかりやってましたがなるほどです。 16日19:50追記 ROMでもやる方法思いつきました。 mov ax,****(絶対アドレス) push ax ret
|
| retならnearも絶対アドレス かかっくん 2026年8月26日(水) 18:03 |
修正 |
> mov ax,****(絶対アドレス) > push ax > ret
成程、retならnearデモ絶対アドレスに成増ね push; retのが短く成増しキャッシュに影響しませんし
call near absなら mov AX,**** (retの次) push AX mov AX,**** (絶対アドレス) push AX ret
186+,V30ならpush immで
jmp near absの代用 68 ** ** ; push imm16 (跳び先、セグメント内絶対アドレス) C3 ; ret
call near absの代用 68 ** ** ; push imm16 (↓のretの次のアドレス) 68 ** ** ; push imm16 (call先、セグメント内絶対アドレス) C3 ; ret
push IP や push IP+dispも有れば楽デスが # 当然でわあるがcallわpush IP+3,push IP+5以外にjmpも伴う
マクロに定義すると好い鴨
macro jmp_near_abs adrs ifdef .8086
mov AX,adrs push AX ret
else
push adrs ret
endif endm
macro call_near_abs adrs ifdef .8086
mov AX,$+9 push AX mov AX,adrs push AX ret
else
push $+7 push adrs ret
endif endm
|
|