(אני יודע אסמבלי של 16)
אין לי מושג באסמבלי בלינוקס
אבל יש לי ספר של springer על אסמבלי 32 ביט .
אני מכיר משפטי תנאי עם jmp cmp .
ראיתי בספר דוגמה של תנאי (כנראה אסמבלי תומכת ב high level ) ?
אולי אני משתמש בקומפיילר לא נכון (אין לי מושג באסמבלי של לינוקס)
אני משתמש ב as זה שבא עם gcc
הקוד הבא מתקמפל :
as mycode.s -o mycode.o --gstabs
ld mycode.o -o mycode
chmod a+x mycode
הקוד:
קוד: |
.section .text
.global start
_start:
movl $1,%eax
movl $2,%ebx
.if ebx==2
mov $101,%ebx
.endif
.if ebx!=2
int $0x80
.endif
|
בכל זאת אני מריץ ב gdb
מסמן breakepoint
: b _start
: run
: layout asm
: run
זה הפלט : (הוא מתעלם מהתנאי)
קוד: |
B+>│0x8048074 <_start> mov $0x1,%eax │
│0x8048079 <_start+5> mov $0x2,%ebx │
│0x804807e <_start+10> int $0x80 │
│0x8048080 add %eax,(%eax) │
│0x8048082 add %al,(%eax) │
│0x8048084 add %al,(%eax) │
│0x8048086 add $0x3000,%eax │
│0x804808b add %cl,(%eax) │
│0x804808d add %al,(%eax) │
│0x804808f add %ah,0x0(%eax,%eax,1) │
│0x8048093 add %dh,0x4(%eax,%eax,4) │
│0x8048097 or %al,(%ecx) │
│0x8048099 add %al,(%eax) │
└───────────────────────────────────────────────────────────────────────────┘
child process 26308 In: _start Line: 6 PC: 0x8048074
[Inferior 1 (process 26304) exited with code 02]
Cannot access memory at address 0x8048080
(gdb) Cannot access memory at address 0x0
|
כלומר הוא מתעלם מהתנאי ויוצא int 80 במקום להציג ערך אחר ב ebx כפי שכתבתי בתוך ה תנאי .
איזה קומפיילר בלינוקס מכיר משפטי if . ואיזה תחביר זה ?
הספר של ספרינגר הוא אסמבלי כללי אולם הם השתמשו ב masm