标签: nasm

理解汇编语言的mul和imul指令的问题

我正在通过paul caurterPC Assembly学习80386

  mul source
Run Code Online (Sandbox Code Playgroud)
  • 如果操作数是字节大小,则将其乘以AL寄存器中的字节,结果存储在AX的16位中.

精细.

  • 如果源是16位,则将其乘以AX中的字,32位结果存储在DX:AX中.

Q1:为什么选择DX:AX?为什么它不能存储在EAX/EDX中?

imul 真是令人困惑

imul dest, source1
imul dest, source1, source2
Run Code Online (Sandbox Code Playgroud)

alt text http://img697.imageshack.us/img697/8976/imul.gif

我在理解表格方面遇到了问题.

Q2:在表的第2个条目中.再次,为什么DX:AX.为什么不EAX或EDX?

现在考虑以下代码片段:

imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx 
call print_int ;  prints the int stored in eax
call …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

8
推荐指数
3
解决办法
2万
查看次数

汇编语言编程提示和技巧

我正在编写自己的"玩具"操作系统,目前我主要是在汇编(NASM)中进行操作 - 部分是因为我希望它能帮助我理解x86的反汇编,也因为我找到了它也很有趣!

这是我第一次使用汇编编程的经验 - 我的选择速度比我想象的要快,但是学习任何明显不同的语言我发现我的代码结构相当混乱,因为我试图找出哪些模式和约定我应该使用.

特别是目前我正在努力:

跟踪寄存器

目前一切都处于16位模式,因此我只有6个通用寄存器可供使用,其中可用于访问存储器的寄存器更少.我继续践踏我自己的寄存器,这反过来意味着我经常交换寄存器来避免这种情况 - 因此我很难跟踪哪些寄存器包含什么值,即使是自由评论.这是正常的吗?有什么我可以做的,以帮助使事情更容易跟踪?

例如,我开始使用被破坏的寄存器列表来评论我的所有函数:

; ================
; c_lba_chs
; Converts logical block addressing to Cylinder / Head / Selector
;  ax (input, clobbered) - LBA
;  ch (output) - Track number (cylinder)
;  cl (output) - Sector number
;  dh (output) - Head number
; ================
Run Code Online (Sandbox Code Playgroud)

跟踪堆栈

在一些情况下,当我用完寄存器时,我已经开始使用堆栈了,但这让事情变得更糟 - 任何比push call pop保存寄存器的简单序列更复杂的事情都会导致我完全失去轨道,使得它甚至变得棘手告诉我堆栈中是否有正确数量的项目(特别是涉及错误处理时 - 见下文),更不用说它们处于什么顺序.我知道必须有更好的方法来使用堆栈,我只是可以看不出它是什么.

处理错误

我一直在使用进位标志和零标志(取决于函数)来向调用者指示错误,例如:

myfn:
    ; Do things
    jz .error
    ; Do more things
    ret

    .error:
        stc
        ret …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

8
推荐指数
1
解决办法
3269
查看次数

64位汇编,何时使用较小尺寸的寄存器

我理解在x86_64汇编中有例如(64位)rax寄存器,但它也可以作为32位寄存器,eax,16位,ax和8位来访问.在什么情况下我不会只使用完整的64位,以及为什么会有什么优势?

举个例子,通过这个简单的hello world程序:

section .data
msg: db "Hello World!", 0x0a, 0x00
len: equ $-msg

section .text
global start

start:
mov rax, 0x2000004      ; System call write = 4
mov rdi, 1              ; Write to standard out = 1
mov rsi, msg            ; The address of hello_world string
mov rdx, len            ; The size to write
syscall                 ; Invoke the kernel
mov rax, 0x2000001      ; System call number for exit = 1
mov rdi, 0              ; Exit success = 0
syscall …
Run Code Online (Sandbox Code Playgroud)

64-bit assembly x86-64 nasm cpu-registers

8
推荐指数
2
解决办法
4135
查看次数

如何从实模式写入带有视频内存地址0xb8000的屏幕?

我创建了简单的代码来从硬盘驱动器加载第二个扇区,然后写入整个屏幕,空格为红色背景.问题是我总是用@符号代替空格.这是代码:

org 0x7C00
bits 16

xor ax,ax
mov ds,ax
mov es,ax

mov bx,0x8000
cli
mov ss,bx
mov sp,ax
sti

cld
clc

xor ah,ah
int 0x13
mov bx,0x07E0
mov es,bx
xor bx,bx
mov ah,0x2 ;function
mov al,0x5 ;sectors to read
mov ch,0x0 ;track
mov cl,0x2 ;sector
mov dh,0x0 ;head
int 0x13
;jc error
;mov ah, [0x7E00]
;cmp ah,0x0
;je error
jmp error
cli
hlt
jmp 0x07E0:0x0000

error:
    xor bx,bx
    mov ax,0xb800
    mov es,ax
    mov al,0x40 ;colour
    mov ah,' ' ;character
    .red: …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode nasm bare-metal

8
推荐指数
1
解决办法
5624
查看次数

NASM是不一致还是我只是错过了即时CMP的明显事实?

"警告:签名的dword立即超出界限"是我现在存在祸害,因为它似乎不一致或者我只是没有看到明显的事实.

我声明了以下结构:

struc   FRTType        
        .class    resq  1   ; Class
        .type     resq  1   ; Type
endstruc 
Run Code Online (Sandbox Code Playgroud)

我有以下分配:

%assign TYPE_SCALAR     0xfffffffffffffff1
%assign INTEGER         0xffffffff1000a8a9
Run Code Online (Sandbox Code Playgroud)

在我的功能中:

cmp     qword [rdi+FRTType.class], TYPE_SCALAR  ; This works fine
jne     .exception
cmp     qword [rdi+FRTType.type], INTEGER       ; THIS PRODUCES WARNING
Run Code Online (Sandbox Code Playgroud)

我知道我可以mov rax, INTEGER然后做比较,但这似乎不需要,因为第一次比较没有问题.

assembly x86-64 nasm

8
推荐指数
1
解决办法
175
查看次数

通过将EFLAGS.VM设置为1,问题从32位保护模式切换到v8086模式

我处于以当前权限级别(CPL = 0)运行的32位保护模式.我试图通过将EFLAGS.VM(位17)标志设置为1(和IOPL为0)并对我的16位实模式代码执行FAR JMP来进入v8086模式.我使用当前的标志PUSHF; 将EFLAGS.VM(第17位)设置为1; 将EFLAGS.IOPL(第22位和第23位)设置为0; 设置新的EFLAGS POPF.这个代码看起来像:

    bits 32
    cli
    [snip]
    pushf                       ; Get current EFLAGS
    pop eax
    or eax, 1<<EFLAGS_VM_BIT    ; Set VM flag to enter v8086 mode
    and eax, ~(3<<EFLAGS_IOPL_BITS)
                                ; Set IOPL to 0
                                ; IF flag already 0 because of earlier CLI
    push eax
    popf                        ; Reload new flags
    jmp CODE32_SEL:v86_mode_entry
                                ; Far JMP to v8086 entry point

    ; v8086 code entry point
    bits 16
    v86_mode_entry:
        hlt                         ; Halt should double fault …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 nasm osdev

8
推荐指数
1
解决办法
261
查看次数

当使用NASM extern语句访问printf时,GCC输出错误"未定义引用`printf'"

我正在学习NASM并且正在编译这段代码(我在这里找到).它使用此NASM命令组装:

nasm -f coff -l printf.lst  printf1.asm
Run Code Online (Sandbox Code Playgroud)

printf.o但这GCC链接命令:

gcc -o printf1  printf1.o
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

printf1.o:printf1.asm:(.text+0x1a): undefined reference to `printf'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?提前致谢.(编辑:我在Windows 7上);

; printf1.asm   print an integer from storage and from a register
; Assemble: nasm -f coff -l printf.lst  printf1.asm
; Link:     gcc -o printf1  printf1.o
; Run:      printf1
; Output:   a=5, eax=7

; Equivalent C code
; /* printf1.c  print an int and an expression */
; #include …
Run Code Online (Sandbox Code Playgroud)

c gcc mingw nasm

7
推荐指数
1
解决办法
7105
查看次数

64位Mac OS X Lion上的nasm/gcc问题

我正在读这篇文章,有一次它给了我这个nasm程序:

; tiny.asm
BITS 32
GLOBAL main
SECTION .text
main:
              mov     eax, 42
              ret
Run Code Online (Sandbox Code Playgroud)

并告诉我运行以下命令:

$ nasm -f elf tiny.asm
$ gcc -Wall -s tiny.o
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ld: warning: option -s is obsolete and being ignored
ld: warning: ignoring file tiny.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit …
Run Code Online (Sandbox Code Playgroud)

macos gcc nasm

7
推荐指数
1
解决办法
7897
查看次数

找不到crtn.o,在64位系统上链接32位代码

我试图在64位系统上使用NASM和GCC组装一些32位代码.我使用以下两个命令

nasm -f elf32 -g -F stabs coc.asm
gcc -m32 -o coc coc.o
Run Code Online (Sandbox Code Playgroud)

LDM看起来很好,但LD抱怨:

/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s …
Run Code Online (Sandbox Code Playgroud)

64-bit gcc nasm ld

7
推荐指数
1
解决办法
1万
查看次数

RESB,RESW,RESD,RESQ在NASM中分配多少字节?

DB 分配1个字节.

DW 分配2个字节.

DD 分配4个字节.

DQ 分配8个字节.

所以我假设:

RESB 1 分配1个字节.

RESW 1 分配2个字节.

RESD 1 分配4个字节.

RESQ 1 分配8个字节.

我对么?


文件并没有太多发言权:

3.2.2 RESB和朋友:声明未初始化的数据

RESB,RESW,RESD,RESQ,REST,RESO,RESY和RESZ设计用于模块的BSS部分:它们声明未初始化的存储空间.每个操作数采用一个操作数,即字节数,字数,双字数或任何要保留的值.如2.2.7节所述,NASM不支持通过编写DW来保留未初始化空间的MASM/TASM语法?或类似的东西:这就是它的作用.RESB类型伪指令的操作数是一个关键表达式:参见3.8节.

例如:

缓冲区:resb 64; 保留64个字节

wordvar:resw 1; 保留一个字

realarray resq 10; 十个实际的阵列

ymmval:resy 1; 一个YMM注册

zmmvals:resz 32; 32个ZMM寄存器

x86 assembly nasm

7
推荐指数
1
解决办法
2万
查看次数

标签 统计

nasm ×10

assembly ×7

x86 ×5

gcc ×3

x86-64 ×3

64-bit ×2

bare-metal ×1

c ×1

cpu-registers ×1

ld ×1

macos ×1

mingw ×1

osdev ×1

real-mode ×1