• ベストアンサー

アセンブラ naskのcall 文法

アセンブラを最近はじめました。 naskで、call printというのをアセンブルするとエラーになります。ラベルは先に見せておかないといけないのでしょうか? call print fin: hlt jmp fin print: ... ret アセンブラの文法で良書が知りたいです。 アセンブラでも構文がそれぞれ違う。ということでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • moritan2
  • ベストアンサー率25% (168/670)
回答No.1

アセンブラの文法というのはアセンブラごとに違います。私がいままで使ったアセンブラではほとんど後方参照ができたと思いますが、アセンブラによってはできないものもあっても不思議ではありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PICアセンブラで悩んでます・・・。

    PIC16F84を使ってアセンブラでプログラムしているのですが、どうしてもアセンブルが成功しません。 エラーを中心にプログラムを削りまくったところ、ADDWF命令とRETLW命令でコケているようです。(テーブル処理) 以下のプログラムで、ADDWFの位置で「ラベル(ADDWF)の位置が変です」というエラーが出てしまいます・・・。  LIST P=PIC16F84;  INCLUDE "P16f84.inc"  ORG 0 START  ADDWF PC,W  END どういうことなんでしょうか?(T-T (タブはスペースに置換済みです)

  • NASMかNASKの文法の本

    NASMかNASKのアセンブラを使っているのですが、MASMと構文が異なっている?せいか、エラーなりました。 MASMでは DW offset ADR_KOKO DW seg ADR_KOKO でOKだと思いますが、NASM/NASKではどうするのでしょうか? NASM,NASMの文法など詳しく載っている本などありますか?(洋書でも構いません。) DW 0 ; A---> オフセット DW 0 ; B---> セグメント ADR_KOKO: ;ここのオフセットとアドレス値をA,Bにセットしたい mov eax, 1  ... RET

  • NASM(独習アセンブラのサンプルソース)について

    独習アセンブラ初版5刷のサンプルソース(リスト6.7、102p)での疑問です 下の方にあるコメントアウトしているputc関数って何のためにあるんですか? どこからも呼び出してないのでいらないと思うのですが… アセンブラはNASMです ※本に書かれてるソースはコメントアウトしてません、コメントアウトしてもアセンブルできました bits 16 org 100h mov dx,sfile mov al,0 mov ah,3dh int 21h jc endquit mov [ifh],ax mov dx,dfile mov cx,0 mov ah,3ch int 21h jc endquit mov [ofh],ax readb: mov bx,[ifh] mov dx,buf mov cx,1 mov ah,3fh int 21h test cx,ax jz endquit jc endquit mov bx,[ofh] mov dx,buf mov cx,1 mov ah,40h int 21h jmp readb endquit: mov bx,[ifh] mov ah,3eh int 21h mov bx,[ofh] mov ah,3eh int 21h mov ax,4c00h int 21h ;putc: ; push ax ; mov ah,2h ; int 21h ; pop ax ; ret ifh dw 0 ofh dw 0 sfile db "srcfile.txt",0 dfile db "destfile.txt",0 buf resb 2 私が思うにリスト6.6(100p)のreadbラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • GNUSim8085でのアセンブラエラー

    現在、GNUSim8085というシミュレーターでアセンブラのシミュレーションデバッグを行っています。それで、”初期化プログラム”というのを貼り付けてみたのですが、 LXI SP,STACK という行でエラーが出てきます。 エラー内容は、 21 Undefined symbol 21 Invalid operand or symbol.Check whether operands start with a number. e.g a0H should be 0a0H ;<Program title> jmp start ;data ;code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; 初 期 化 プ ロ グ ラ ム ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start: nop di LXI SP,STACK ; lxi h,?ramsta mvi b,0 mvi a,0 ;call fill hlt

  • casl(2)の質問

    じゃんけんの勝敗を判定するプログラム PLAY1とPLAY2の手の結果がHANTEIに格納される PLAY1とPLAY2にはグ-(0)、チョキ(1)、パー(2) HANTEIにはPLAY1が勝ち(1)、PLAY2が勝ち(2)、あいこ(0)が入る TEST    START   BEGIN BEGIN   LAD   GR1,PLAY1       CALL    SUB       RET PLAY1   DC     1 PLAY2   DC     2 HANTEI   DS     1       END SUB    START      PUSH    0,GR2      PUSH    0,GR3      PUSH    0,GR4      LD     GR2,0,GR1      LAD     GR4,0 LP    CPA     GR2,1,GR1      JZE     FIN      ****     *******      LAD     GR2,1,GR2      CPA     GR2,=3      JMI     JMP      SUBA     GR2,=3 JMP    JUMP    LP FIN    ST     GR4,2,GR1      POP     GR4      POP     GR3      POP     GR2      RET      END 主プログラムではPLAY1(チョキ)とPLAY2(パー)をセットしています。 副プログラムの***の部分の命令には何が入ればいいでしょうか?

  • CASIOのポケコンZ-1GRのRET命令について。

    CASIOのポケコンZ-1GRのRET命令について。 いつもお世話になっております。 小生、現在CASIOのポケコンZ-1GRにて8086アセンブリを勉強している、 アセンブリ初心者です。 今回質問させて頂きたいのは、Z-1GRのアセンブリでラベル内にRET命令を記述し、 アセンブル、実行するとZ-1GRが終了してしまう現象についてです。 再現手順は以下のようになります。 1.Z-1GRを起動。 2.CREAR ,200と入力し、エンターキー押下。 3.menuキー押下し、メニュー画面を表示。 4.キー5を押下し、アセンブリモードに推移。 5.キーSを押下し、エディタを起動。 6.下記のプログラムを記述 ORG 2000H START: MOV AX, 0001H MOV DX, 000FH CMP AX,DX JC LABEL_1 MOV CX, 000FH JMP EXIT LABEL_1: MOV CX,0001H RET EXIT: IRET END 7.Shift+menuキーでアセンブリモードに推移。 8.キーAでアセンブル。 9.アセンブル完了画面が表示される。 10.BRKキー押下、monと入力、エンターキー押下。 11.デバッグ画面に推移し、G2000 ,2014と入力しエンターキー押下。 12.Z-1GRが終了する。 以上です。 もしかして、Z-1GRの仕様でラベル内ではRET命令を使えない事になっているのでしょうか? お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

  • アセンブラ言語

    平成17年度 春期 基本情報技術者の問題について質問ですが http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H17a2/pm13.html 以下のようにエラーが出てどこがいけないのか分かりません。 どこがいけないのか教えてくれませんか? 0000 NREAD START 0002 RPUSH 0004 IN INBUF,LENG 0006 1020 0151 LD GR2,LENG 0008 6300 0288 JZE ERR 000A 6100 0288 JMI ERR 000C 1210 0051 LAD GR1,INBUF 000E 2621 ADDL GR2,GR1 000F 1230 0000 LAD GR3,0 0011 1250 0001 LAD GR5,1 0013 1260 0000 LAD GR6,0 0015 0000 0000 LOOP CPL GR1,GR2 ラベルの重複 0016 6300 0043 JZE CNV 0018 1041 0000 LD GR4,0,GR1 001A 4140 0296 CPL GR4,=' ' 001C 6300 003B JZE NEXT 001E 1433 LD GR3,GR3 001F 6200 002D JNZ NUMCHK 0021 1230 0001 LAD GR3,1 0023 4140 0297 CPL GR4,='-' 0025 6200 002D JNZ NUMCHK 0027 1145 0152 ST GR4,NUMSTR,GR5 0029 1255 0001 LAD GR5,1,GR5 002B 6400 003B JUMP NEXT 002D 4140 0298 NUMCHK CPL GR4,='9' 002F 6500 0288 JPL ERR 0031 4140 0299 CPL GR4,='0' 0033 6100 0288 JMI ERR 0035 1145 0152 ST GR4,NUMSTR,GR5 0037 1255 0001 LAD GR5,1,GR5 0039 1266 0001 LAD GR6,1,GR6 003B 1211 0001 NEXT LAD GR1,1,GR1 003D 6400 026A JUMP LOOP 003F 0000 0000 ERR LAD GR0,-32768 ラベルの重複 0041 6400 0293 JUMP EXIT 0043 1466 CNV LD GR6,GR6 0044 6300 0288 JZE ERR 0046 1255 FFFF LAD GR5,-1,GR5 0048 1150 0152 ST GR5,NUMSTR 004A 1210 0152 LAD GR1,NUMSTR 004C 8000 0255 CALL DTOB 004E EXIT RPOP ラベルの重複 0050 8100 RET 0051 0000 INBUF DS 256 0151 0000 LENG DS 1 0152 0000 NUMSTR DS 257 0253 END 0255 DTOB START 0257 RPUSH 0259 1021 0000 LD GR2,0,GR1 025B 2621 ADDL GR2,GR1 025C 1200 0000 LAD GR0,0 025E 1230 0000 LAD GR3,0 0260 1041 0001 LD GR4,1,GR1 0262 4140 0297 CPL GR4,='-' 0264 6200 026A JNZ LOOP 0266 1230 0001 LAD GR3,1 0268 1211 0001 LAD GR1,1,GR1 026A 1211 0001 LOOP LAD GR1,1,GR1 026C 4512 CPL GR1,GR2 026D 6500 028C JPL FIN 026F 1041 0000 LD GR4,0,GR1 0271 2340 0299 SUBL GR4,='0' 0273 5200 0001 SLL GR0,1 0275 6100 0288 JMI ERR 0277 1450 LD GR5,GR0 0278 5200 0001 SLL GR0,1 027A 6100 0288 JMI ERR 027C 5200 0001 SLL GR0,1 027E 6100 0288 JMI ERR 0280 2605 ADDL GR0,GR5 0281 6100 0288 JMI ERR 0283 2604 ADDL GR0,GR4 0284 6100 0288 JMI ERR 0286 6400 026A JUMP LOOP 0288 1200 8000 ERR LAD GR0,-32768 028A 6400 0293 JUMP EXIT 028C 1433 FIN LD GR3,GR3 028D 6300 0293 JZE EXIT 028F 3200 029A XOR GR0,=#FFFF 0291 2000 029B ADDA GR0,=1 0293 EXIT RPOP 0295 8100 RET 0296 0020 DC ' ' 0297 002D DC '-' 0298 0039 DC '9' 0299 0030 DC '0' 029A FFFF DC #FFFF 029B 0001 DC 1 029C END

  • インラインアセンブラの関数について質問です。

    C言語で書かれたプログラムの中に、アセンブラで書かれた関数を使うため、インラインアセンブラで関数を作っていたのですが、私の能力の限界を感じたので、是非、ご教授願います。以下に示します。 元のアセンブラの関数write_mem82(int addr, int data) MOV EAX, [ESP+4] MOV AL, [ESP+8] MOV [EAX], AL RET です。これは、OS○作○門という本に載っていたものですが、プログラムをインラインアセンブラにすると、成功するのかふと疑問に思ったのです。よって、アセンブラの種類は、nasmを基にしたnaskです。 こういうことは、その本のサポートページか何かで質問すればよい的なことをおっしゃる方もおられると思います。残念ながら、サポートページは、ほぼ凍結状態で、何年待てば回答が返ってくるのか?という状態です。 そういう経歴で、ここの質問させていただくに至りました。 肝心の、私が書いてコンパイルエラーになるプログラムを書きます。 static __inline__ void write_mem82(int addr, int data){ __asm__ ( "MOV EAX,[ESP+4]": "MOV AL,[ESP+8]" "MOV [EAX],AL" "RET" ); } です。"MOV [EAX],AL"でエラーが出ます内容は構文が間違っているという内容のものです。なお、関数の名前は、意図的に変えてあります。オリジナルとは違います。 大した関数ではないのかもしれないのですが、わからないのでよろしくおねがいいたします。

  • VC2008のアセンブラ出力

    Visual C++ 2008 Express Editionで勉強をしています。 Cで簡単なプログラムを作り、そのアセンブラ出力を見ているのですが、下のアセンブラリストの###部のようなCの記述と関係ないコードが追加されます。この行を削除してアセンブルしても動作に問題ないように見えます。 このコードが追加される意味を教えて下さい。名前からセキュリティに関係しそうですが…… またプログラムによって追加される場合と、されない場合があります。何故でしょう? ご教示いただければ幸いです。 ----scanf.c #include <stdio.h> #include <stdlib.h> int main(void) { int i; char buf[256]; scanf("%s",buf); i = atoi(buf); printf("%d\n",i); return 0; } ----- -----scanf.asm ; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 TITLE D:\vc_asm\scanf.c .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES _DATA SEGMENT $SG3702 DB '%s', 00H ORG $+1 $SG3703 DB '%d', 0aH, 00H _DATA ENDS PUBLIC __$ArrayPad$ PUBLIC _main EXTRN _printf:PROC EXTRN _atoi:PROC EXTRN _scanf:PROC EXTRN ___security_cookie:DWORD EXTRN @__security_check_cookie@4:PROC ; Function compile flags: /Odtp _TEXT SEGMENT _buf$ = -264 ; size = 256 __$ArrayPad$ = -8 ; size = 4 _i$ = -4 ; size = 4 _main PROC ; Line 5 push ebp mov ebp, esp sub esp, 264; 00000108H mov eax, DWORD PTR ___security_cookie ###この行 xor eax, ebp ###この行 mov DWORD PTR __$ArrayPad$[ebp], eax ###この行 ; Line 8 lea eax, DWORD PTR _buf$[ebp]  (中略  Cで記述した内容の動作が記載) ; Line 11 xor eax, eax ; Line 12 mov ecx, DWORD PTR __$ArrayPad$[ebp] ###この行 xor ecx, ebp ###この行 call @__security_check_cookie@4 ###この行 mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END -----

  • Z80のアセンブリをアセンブルしたいのですが。。。

    Z80のアセンブリをアセンブルしたいのですが。。。 いつもお世話になっております。 小生、只今、WindowsXPSP3上でZ-Vision6.42付録版を用いて、Z80のアセンブリを勉強しています。 今回質問させて頂きたいのは、下記に記述させて頂くコードがZ-Visionではアセンブルできません。 -----ソース----- OBJ $0100,$01FF FRE $1000,$1FFF CALL TEST END TEST: LD HL,1000 LD A,$FF LD B,32 L_TEST LD (HL),A INC HL DEC B JP NZ,L_TEST RET ---------- 上記に記述させて頂いたコードをアセンブルすると、以下の様なエラーが出ます -----エラー内容----- - Can not open message file. -Pass-1 -Pass-2 -Pass-3 C:\PROGRAM FILES\ZVW6\Z80PROGRAM\TEST.ASM 1 :Asm Error: 4013 C:\PROGRAM FILES\ZVW6\Z80PROGRAM\TEST.ASM 2 :Asm Error: 4013 C:\PROGRAM FILES\ZVW6\Z80PROGRAM\TEST.ASM 9 :Asm Error: 4011 C:\PROGRAM FILES\ZVW6\Z80PROGRAM\TEST.ASM 11 :Asm Error: 4013 C:\PROGRAM FILES\ZVW6\Z80PROGRAM\TEST.ASM 15 :Asm Error: 4011 -Warnings : 0- -Errors : 5- ---------- そこで、大変申し訳ないのですが、このコードをアセンブルできるフリーソフトなどご教示頂ければ、幸いです。 お忙しい中、大変申し訳ございませんが、以上、先輩方ご教示宜しくお願い致します。