我正在学习汇编语言.
在Microsoft Visual Studio 2017中,我想检查寄存器标志的当前状态.
我想知道每个寄存器标志的缩写代表什么,所以我在x86寄存器标志上查看wiki页面.
但正如您所看到的,Visual Studio中显示的寄存器标志缩写与Wiki页面中的缩写不匹配.
对于visual studio中的注册标志,我如何找出它们代表什么?
我阅读了关于GDT(全局描述符表)的教程,该教程将GDT定义为"为内存的某些部分定义基本访问权限的那个".这意味着GDT用于记忆保护.
它是否执行除上述以外的任何其他任务?
是否必须在操作系统中实施GDT?
简而言之,如果有人能够以易于理解的方式详细阐述GDT,那将会更好.
谢谢
我尝试编写一个汇编代码,确定28是否是一个完整的数字.但我有一个问题.当我运行代码时,emu8086无法识别我的标签.
例如,在此代码中:
mov dl,1ch
mov bl,00h ;sum
mov cl,1ch ;counter
dec cl
HERE : mov ax,00h
mov al,dl
div cl ;ax/dl ah=remainder
cmp ah,00h
je SUM ; if ah=0 jump the label SUM
loop HERE
mov dh,00h
cmp dl,bl
je PERFECT
hlt
SUM :
add bl,cl
jmp HERE
PERFECT :
mov dh,01
hlt
Run Code Online (Sandbox Code Playgroud)
当loop HERE指令运行时,emu8086运行mov dl,1ch我的代码的第一条指令().我能做什么?问题是什么?
提前致谢...
我是8086程序集编程的新手,我有一个问题.
我有一个大小约1400个字符的字符串.当我试图定义它时:
.data
mystring DB '(string with 1400 characters)'
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误
"未终止的字符串".
我正在使用emu8086模拟器.我认为我的字符串不适合DB.有没有办法在字节中保留大字符串?
我正在汇编中创建一个 iso 文件,并且想为文本添加颜色(在本例中为:红色)。
有谁知道该怎么做?
[BITS 16]
[ORG 0x7C00]
jmp main
main:
mov si, string ; si=string
call printstr
jmp $
printstr:
lodsb ; al=&si[0]
cmp al,0 ;FLAGS = 0
jnz print
ret
print:
mov ah,0Eh
int 10h
jmp printstr
string db "HELLO WORLD!",13,10,0
times 510 - ($-$$) db 0
dw 0xAA55
Run Code Online (Sandbox Code Playgroud) 最近我有一个问题,我知道一个指向常量数组的指针(在下面的代码中初始化)位于该.rodata区域中,并且该区域仅可读。但是,我在模式C11中看到,此内存地址行为的写入将是不确定的。我知道Borland的Turbo-C编译器可以在指针指向的地方写,这是因为处理器在当时的某些系统上以实模式运行,例如MS-DOS?还是与处理器的操作模式无关?使用保护模式下的处理器,是否还有其他编译器可以写入指针并且不会导致任何内存破坏失败?
#include <stdio.h>
int main(void) {
char *st = "aaa";
*st = 'b';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此代码与MS-DOS中的Turbo-C一起编译时,您将能够写入内存
什么阻止我执行jmp @9274592即使它超出我的程序的限制?我不是直接写入CPU吗?在我假设的操作系统中,究竟是什么阻止命令被执行?
\xe2\x80\x98checksum\xe2\x80\x99 的用途是什么?
\n\n字段 \xe2\x80\x98checksum\xe2\x80\x99 是一个 32 位无符号值,当添加到其他魔术字段(即 \xe2\x80\x98magic\xe2\x80\x99 和 \xe2\x80\ x98flags\xe2\x80\x99),必须有一个 32 位无符号和为零。
\n\ndd 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start))\nRun Code Online (Sandbox Code Playgroud)\n 我收到此错误:
loop AdderLoop
Run Code Online (Sandbox Code Playgroud)
错误A2075:跳转目标太远:25个字节
这是一个加法器程序.
我还在学习pop,push所以也许我没有做正确的事,但似乎我的变量ARRAY_SIZE没有正确存储?
我在程序开始时按下存储ARRAY_SIZE的寄存器,并在程序结束时将其弹出.
.386 ;identifies minimum CPU for this program
.MODEL flat,stdcall ;flat - protected mode program
;stdcall - enables calling of MS_windows programs
;allocate memory for stack
;(default stack size for 32 bit implementation is 1MB without .STACK directive
; - default works for most situations)
.STACK 4096 ;allocate 4096 bytes (1000h) for stack
;*******************MACROS********************************
;mPrtStr
;usage: mPrtStr nameOfString
;ie to display a 0 terminated string named message say:
;mPrtStr message …Run Code Online (Sandbox Code Playgroud) 请告诉我以下汇编(伪)代码的结果是什么?
我们已经设置寄存器的所有位EAX为0,这样反过来我们也有AH,AL和AX为0。但是,当我减去最低位AL,我们将采取补和补充,给我们一堆1秒,随后一0。
XOR eax, eax
SUB al 0x01
Run Code Online (Sandbox Code Playgroud)
因此,总而言之,我的问题是在执行上述代码时,将仅AL充满1,或者也将延续到AX和EAX。