すいません、VB4しかやってないんです、VBAはやったけど(ぼそ) チラシの裏だって立派な書き込み空間なんだからねっ!資源の有効活用なんだからねっ!とか偉そうに言ってるけど、実は色々と書き残したいだけ

だからなに? どうしろと? くるみサイズの脳みそしかないあやしいジャンガリアンベムスターがさすらう贖罪蹂躙(ゴシックペナルティ)

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  632  : 記事  35  : コメント  11671  : トラックバック  143

ニュース


片桐 継 は
こんなやつ

かたぎり つぐ ってよむの

大阪生まれ河内育ちなんだけど
関東に住みついちゃったの
和装着付師だったりするの
エセモノカキやってたりするの
VBが得意だったりするの
SQL文が大好きだったりするの
囲碁修行中だったりするの
ボトゲ好きだったりするの
F#かわいいよF#

正体は会った人だけ知ってるの

空気読まなくてごめんなさいなの


わんくまリンク

C#, VB.NET 掲示板
C# VB.NET掲示板

わんくま同盟
わんくま同盟Blog


WindowsでGo言語
WindowsでGo言語


ネット活動


SNSは疲れました

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

イベント活動

プログラムの活動

悩んだ悩んだ、出展探すのに。結局は、Microsoftさんのサイトでなく、Intelさんで見つけた。

探し物は、「汎用レジスタ」について。

ソース見て、書いて、いじれば自然と判ってきたけれど、やっぱり、「こうだよ」と背中をおしてほしいじゃない?出展はここで、こうだからこうなんだよ?としっかりと脳味噌に理解させたいしさ。

というわけで、

日本語技術資料のダウンロード
http://www.intel.com/jp/download/index.htm

の中の「IA-32 インテルR アーキテクチャ ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ」の60ページ、3-4「基本プログラム実行レジスタ」の章がズバリそれ。

・ EAX - オペランドと結果データ用のアキュムレータ。
・ EBX - DSセグメント内のデータに対するポインタ。
・ ECX -ストリング操作およびループ操作用のカウンタ。
・ EDX -I/Oポインタ。
・ ESI - DSレジスタがポイントするセグメント内のデータに対するポインタ;スト
リング操作ではソースポインタ。
・ EDI - ES レジスタがポイントするセグメント内のデータ(またはデスティネー
ション)に対するポインタ;ストリング操作ではデスティネーション・ポインタ。
・ ESP -(SSセグメント内の)スタックポインタ。
・ EBP - (SSセグメント内の)スタック上のデータに対するポインタ。

ああ、すっきりした。

MASMでプログラミングする時に、同じ機能を書いたとしても、汎用レジスタを目的にあわせて正しく使ってないと変な動きになったり、例外になったりしちゃうって判った。

とりあえず、上中下。がっつり読んでみたなぁ。

とその前に、発端となったプログラム(イミフ)のソース。

呼び出し元はC。

#include    
 
int MasmPlus(int);
int  wInt = 11;
  
int main(int argc, char* argv[])   
{   

   printf ("%d\n", wInt);   
   printf ("%d\n", MasmPlus (14)); 

   return 0;
}

呼ばれMASM。やりたかった事は、渡された数字をwIntに足すだけの処理。

; Filename: MasmPlus.ASM   
.386   
.MODEL flat, C

EXTERN wInt:DWORD

.CODE   
  
MasmPlus PROC addInt:DWORD   
  
    mov esi, addInt 
    mov ebx, wInt   
    add esi, ebx     ;esiなので正しくない

  ret   
  
MasmPlus ENDP   

END  

結果(11+14なのにorz)

image

で、これを下記のように修正して、

; Filename: MasmPlus.ASM   
.386   
.MODEL flat, C

EXTERN wInt:DWORD

.CODE   
  
MasmPlus PROC addInt:DWORD   
  
    mov eax, addInt 
    mov ebx, wInt   
	add eax, ebx  ;eaxに変えてみる

  ret   
  
MasmPlus ENDP   

END  

実行すると、

image

おお、動いた。

投稿日時 : 2010年8月4日 12:08

コメント

# re: 汎用レジスタってやつがいる 2010/08/04 12:42 渋木宏明
今はインテル系も「汎用レジスタ」って言葉を使うんだっけ?

太古の昔、インテル系の CPU のレジスタはそれぞれ主たる役割が決まって(=レジスタごとに利用可能な命令が多少異なって)いて、16bit 時代辺りまで「汎用レジスタ」ってのは無かった。

i386 辺りから、レジスタの汎化が進んだけど、当時すでに「汎用レジスタ」って言ってたかどうか覚えてない (^^;

ちなみに、モトローラ系の CPU は 16bit 自体にはレジスタの大部分が「汎用レジスタ」でした。


# re: 汎用レジスタってやつがいる 2010/08/04 12:55 かたぎり
インテルさんでも3-4-1の章タイトルが「汎用レジスタ」だったよ
86系やってたはずなのに、なんでこんなに綺麗に忘れてるんだろうとか思ったorz



# re: 汎用レジスタってやつがいる 2010/08/04 13:26 とおりすがり
「関数の返値はeaxに入れる」というルールがあります。
add esi,ebx のあとに mov eax,esi を入れれば正しく動くのでは?


# re: 汎用レジスタってやつがいる 2010/08/04 13:38 あんどちん
汎用レジスタってフラグレジスタのような特殊レジスタではないものを指しているんじゃないかと。

> 「関数の返値はeaxに入れる」というルールがあります。
このへんはコンパイラによっても変わる可能性がありますね
# x86なら殆どEAXでしょうが

あと、上のソースの最後
> </stdio.h>
HTMLやXMLのタグじゃないし^^

# re: 汎用レジスタってやつがいる 2010/08/04 14:32 かたぎり
>とおりすがりさん
まいどー、うん、そんな気がする。
eaxに入れてあげるとちゃんと戻ってくるみたいだし

>あんどちん
だって、ブログ記事修正すると勝手に文字変換されるんだもんorz

# re: 汎用レジスタってやつがいる 2010/08/04 21:44 774RR
高級言語をコンパイルした結果のアセンブラは、一般的に各CPU/OSにおける一定規則に従う必要があります。
この規則を ABI (Application Binary Interface) とかいいます。

・関数の引数の渡し方規則
・関数の返却値の戻し方規則
・レジスタ破壊・保存規則
・スタック補正規則
などなどが決まっています。

x86 32bit FLAT モデルにおいては
(32bit 以下の) 返却値は EAX に戻す
EBX,ESI,EDI,EBP は関数の中で使ってもよいが、関数呼び出しの前後で保存する
などの規則が決まっています。

アセンブラ中で EBX や ESI を壊すと、そのアセンブラ関数を呼び出す側関数が異常動作します。
要注意。

# re: 汎用レジスタってやつがいる 2010/08/05 16:39 名無し
前のエントリでuses esiを使ってたあたりわざとやっている感

# re: 汎用レジスタってやつがいる 2010/08/09 23:53 かたぎり
>数字のななしさん

そなのよね、そういうことを少し勉強できたと思う

>もじのななしさん

んー、わざとできるほど、計算できる脳味噌はもってないの
ごめんね

# WsKOokZBicVUjDblecQ 2021/07/03 3:04 https://amzn.to/365xyVY
Perfectly composed articles, Really enjoyed studying.

# re: ????????????? 2021/08/08 1:22 hydroxychoroquine
side effects of chloroquine https://chloroquineorigin.com/# whats hcq

Post Feedback

タイトル
名前
Url:
コメント